Controller for Working with Cell Containing Checkbox

Description: controller for working with menu settings in the key-value format.

The ElementsViewController.h File

#import "BaseSettingsViewController.h"
@interface ElementsViewController : BaseSettingsViewController<CheckmarkedCellDelegate>
// Handles event of pressing settings menu child cell transition button
-(void) detailDisclosureButtonClicked: (NSIndexPath *) indexPath;
// Handles event of tapping settings menu basic cell
-(void) settingsCellClick:(NSIndexPath *) indexPath;
@end

The ElementsViewController.m File

#import "ElementsViewController.h"

@implementation ElementsViewController

// Returns value object by key
- (NSObject *)settingsValueForKey:(NSString *)key {
    NSObject *result = nil;
    if ([@"X_METRIC" isEqualToString:key]) {
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
        SettingsCheckmarkedCell *checkmarkedCell = (SettingsCheckmarkedCell *)[self tableView:[self tableView] cellForRowAtIndexPath: indexPath];
        result = [NSNumber numberWithBool:[checkmarkedCell checked]];
    }
    else if ([@"Y_METRIC" isEqualToString:key]) {
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:1 inSection:0];
        SettingsCheckmarkedCell *checkmarkedCell = (SettingsCheckmarkedCell *)[self tableView:[self tableView] cellForRowAtIndexPath: indexPath];
        result = [NSNumber numberWithBool:[checkmarkedCell checked]];
    }
    else if ([@"Z_METRIC" isEqualToString:key]) {
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:1 inSection:0];
        SettingsCheckmarkedCell *checkmarkedCell = (SettingsCheckmarkedCell *)[self tableView:[self tableView] cellForRowAtIndexPath: indexPath];
        result = [NSNumber numberWithBool:[checkmarkedCell checked]];
    }
    else if ([@"COLOR_METRIC" isEqualToString:key]) {
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:2 inSection:0];
        SettingsCheckmarkedCell *checkmarkedCell = (SettingsCheckmarkedCell *)[self tableView:[self tableView] cellForRowAtIndexPath: indexPath];
        result = [NSNumber numberWithBool:[checkmarkedCell checked]];
    }
    else if ([@"SIZE_METRIC" isEqualToString:key]) {
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:3 inSection:0];
        SettingsCheckmarkedCell *checkmarkedCell = (SettingsCheckmarkedCell *)[self tableView:[self tableView] cellForRowAtIndexPath: indexPath];
        result = [NSNumber numberWithBool:[checkmarkedCell checked]];
    }
    else if ([@"NUMBER1" isEqualToString:key]) {
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
        SettingsTextInputCell *textInputCell = (SettingsTextInputCell *)[self tableView:[self tableView] cellForRowAtIndexPath: indexPath];
        result = [[textInputCell textInput] text];
    }
    else if ([@"NUMBER2" isEqualToString:key]) {
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:1 inSection:0];
        SettingsTextInputCell *textInputCell = (SettingsTextInputCell *)[self tableView:[self tableView] cellForRowAtIndexPath: indexPath];
        result = [[textInputCell textInput] text];
    }
    else if ([@"NUMBER3" isEqualToString:key]) {
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
        SettingsCell *textInputCell = (SettingsCell *)[self tableView:[self tableView] cellForRowAtIndexPath: indexPath];
        result = [textInputCell textLabel];
    }
    else if ([@"NUMBER4" isEqualToString:key]) {
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:1 inSection:0];
        SettingsDetailTextTableViewCell *textInputCell = (SettingsDetailTextTableViewCell *)[self tableView:[self tableView] cellForRowAtIndexPath: indexPath];
        result = [textInputCell textLabel];
    }
    else if([@"CAPTION" isEqualToString: key]) {
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:1];
        SettingsCheckmarkedCell *checkmarkedCell = (SettingsCheckmarkedCell *)[self tableView:[self tableView] cellForRowAtIndexPath: indexPath];
        result = [NSNumber numberWithBool:[checkmarkedCell checked]];
    }
    else if([@"DETAIL_CAPTION" isEqualToString: key]) {
        result = @"Table title";
    }
    else if([@"COLOR" isEqualToString: key]) {
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:3];
        SettingsColorTableViewCell *colorCell = (SettingsColorTableViewCell *)[self tableView:[self tableView] cellForRowAtIndexPath: indexPath];
        result = [colorCell color];
    }
    else if ([@"SWITCH" isEqualToString:key]) {
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
        SettingsSwitchTableViewCell *switchTableViewCell = (SettingsSwitchTableViewCell *)[self tableView:[self tableView] cellForRowAtIndexPath: indexPath];
        result = [NSNumber numberWithBool: [[switchTableViewCell switchControl] isOn]];
    }
    else if([@"CHECK" isEqualToString: key]) {
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:1];
        SettingsCheckmarkedColorCell *checkmarkedColorCell = (SettingsCheckmarkedColorCell *)[self tableView:[self tableView] cellForRowAtIndexPath: indexPath];
        result = [NSNumber numberWithBool:[checkmarkedColorCell checked]];
    }
    else if([@"CHECK_COLOR" isEqualToString: key]) {
        result = [UIColor colorWithRed:0 green:255 blue:0 alpha:0.5];
    }
    else if([@"BORDER_WEIGHT" isEqualToString: key]) {
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:5];
        SettingsCheckmarkedSpinnerCell *checkmarkedSpinnerCell = (SettingsCheckmarkedSpinnerCell *)[self tableView:[self tableView] cellForRowAtIndexPath: indexPath];
        result = [NSNumber numberWithBool:[checkmarkedSpinnerCell checked]];
    }
    else if([@"SPINNER_BORDER_WEIGHT" isEqualToString: key]) {
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:5];
        SettingsCheckmarkedSpinnerCell *checkmarkedSpinnerCell = (SettingsCheckmarkedSpinnerCell *)[self tableView:[self tableView] cellForRowAtIndexPath: indexPath];
        result = [NSNumber numberWithInt: [(SpinnerControl *)[checkmarkedSpinnerCell accessoryView] value]];
    }
    return result;
}

// Returns logical value by key
-(BOOL) settingsBoolValueForKey:(NSString *)key {
    NSObject *result = [self settingsValueForKey: key];
    return [((NSNumber*)result) boolValue];
}

// Returns integer value by key
-(int) settingsIntValueForKey:(NSString *)key {
    NSObject *result = [self settingsValueForKey: key];
    return [((NSNumber*)result) intValue];
}

// Returns real value by key
-(double) settingsDoubleValueForKey:(NSString *)key {
    NSObject *result = [self settingsValueForKey: key];
    return [((NSNumber*)result) doubleValue];
}

// Sets value object by key
- (void)setSettingsValue:(NSObject *)value forKey:(NSString *)key {
    if ([@"X_METRIC" isEqualToString:key]) {
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
        SettingsCheckmarkedCell *checkmarkedCell = (SettingsCheckmarkedCell *)[self tableView:[self tableView] cellForRowAtIndexPath: indexPath];
        [checkmarkedCell setChecked: [(NSNumber*)value boolValue]];
    }
    else if ([@"Y_METRIC" isEqualToString:key]) {
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:1 inSection:0];
        SettingsCheckmarkedCell *checkmarkedCell = (SettingsCheckmarkedCell *)[self tableView:[self tableView] cellForRowAtIndexPath: indexPath];
        [checkmarkedCell setChecked: [(NSNumber*)value boolValue]];
    }
    else if ([@"COLOR_METRIC" isEqualToString:key]) {
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:2 inSection:0];
        SettingsCheckmarkedCell *checkmarkedCell = (SettingsCheckmarkedCell *)[self tableView:[self tableView] cellForRowAtIndexPath: indexPath];
        [checkmarkedCell setChecked: [(NSNumber*)value boolValue]];
    }
    else if ([@"SIZE_METRIC" isEqualToString:key]) {
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:3 inSection:0];
        SettingsCheckmarkedCell *checkmarkedCell = (SettingsCheckmarkedCell *)[self tableView:[self tableView] cellForRowAtIndexPath: indexPath];
        [checkmarkedCell setChecked: [(NSNumber*)value boolValue]];
    }
    else if ([@"NUMBER1" isEqualToString:key]) {
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
        SettingsTextInputCell *textInputCell = (SettingsTextInputCell *)[self tableView:[self tableView] cellForRowAtIndexPath: indexPath];
        [[textInputCell textInput] setText: (NSString*)value];
    }
    else if ([@"NUMBER2" isEqualToString:key]) {
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:1 inSection:0];
        SettingsTextInputCell *textInputCell = (SettingsTextInputCell *)[self tableView:[self tableView] cellForRowAtIndexPath: indexPath];
        [[textInputCell textInput] setText: (NSString*)value];
    }
    if ([@"CAPTION" isEqualToString:key]) {
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:1];
        SettingsDetailCheckmarkedCell *checkmarkedCell = (SettingsDetailCheckmarkedCell *)[self tableView:[self tableView] cellForRowAtIndexPath: indexPath];
        [checkmarkedCell setChecked: [(NSNumber*)value boolValue]];
    }
    if ([@"SIZE" isEqualToString:key]) {
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:2];
        SettingsSpinnerTableViewCell *spinnerCell = (SettingsSpinnerTableViewCell *)[self tableView:[self tableView] cellForRowAtIndexPath: indexPath];
        [[spinnerCell spinnerControl] setValue: [(NSNumber *)value intValue]];
    }
    if ([@"COLOR" isEqualToString:key]) {
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:3];
        SettingsColorTableViewCell *colorCell = (SettingsColorTableViewCell *)[self tableView:[self tableView] cellForRowAtIndexPath: indexPath];
        [colorCell setColor: (UIColor *)value];
    }
    if ([@"SWITCH" isEqualToString:key]) {
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:4];
        SettingsSwitchTableViewCell *switchTableViewCell = (SettingsSwitchTableViewCell *)[self tableView:[self tableView] cellForRowAtIndexPath: indexPath];
        [[switchTableViewCell switchControl] setOn: [(NSNumber*)value boolValue]];
    }
    if ([@"CHECK" isEqualToString:key]) {
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:4];
        SettingsCheckmarkedColorCell *checkmarkedColorCell = (SettingsCheckmarkedColorCell *)[self tableView:[self tableView] cellForRowAtIndexPath: indexPath];
        [checkmarkedColorCell setChecked: [(NSNumber*)value boolValue]];
    }
    if ([@"BORDER_WEIGHT" isEqualToString:key]) {
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:5];
        SettingsCheckmarkedSpinnerCell *checkmarkedSpinnerCell = (SettingsCheckmarkedSpinnerCell *)[self tableView:[self tableView] cellForRowAtIndexPath: indexPath];
        [checkmarkedSpinnerCell setChecked: [(NSNumber*)value boolValue]];
    }
    if ([@"SPINNER_BORDER_WEIGHT" isEqualToString:key]) {
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:5];
        SettingsCheckmarkedSpinnerCell *checkmarkedSpinnerCell = (SettingsCheckmarkedSpinnerCell *)[self tableView:[self tableView] cellForRowAtIndexPath: indexPath];
        [(SpinnerControl *)[checkmarkedSpinnerCell accessoryView] setValue: [(NSNumber *)value intValue]];
    }
}

// Sets real value by key
-(void) setSettingsDoubleValue:(double)value forKey:(NSString *)key {
    NSNumber *doubleValue = [NSNumber numberWithDouble: value];
    [self setSettingsValue:doubleValue forKey: key];
}

// Sets integer value by key
-(void) setSettingsIntValue:(int)value forKey:(NSString *)key {
    NSNumber *intValue = [NSNumber numberWithInt: value];
    [self setSettingsValue:intValue forKey: key];
}

// Sets logical value by key
-(void) setSettingsBoolValue:(BOOL)value forKey:(NSString *)key {
    NSNumber *boolValue = [NSNumber numberWithBool: value];
    [self setSettingsValue: boolValue forKey: key];
}

// Returns path to element as an object of the NSIndexPath type
- (NSIndexPath*) indexPathForKey:(NSString*) key {
    NSIndexPath *indexPath = nil;
    if ([@"X_METRIC" isEqualToString:key]) {
        indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
    }
    else if ([@"Y_METRIC" isEqualToString:key]) {
        indexPath = [NSIndexPath indexPathForRow:1 inSection:0];
    }
    else if ([@"COLOR_METRIC" isEqualToString:key]) {
        indexPath = [NSIndexPath indexPathForRow:2 inSection:0];
    }
    else if ([@"SIZE_METRIC" isEqualToString:key]) {
        indexPath = [NSIndexPath indexPathForRow:3 inSection:0];
    }
    return indexPath;
}

// Executes operation by key
- (void)performSettingsAction:(NSString *)key {
    NSIndexPath *indexPath = [self indexPathForKey:key];
    SettingsCheckmarkedCell *checkmarkedCell = (SettingsCheckmarkedCell *)[self tableView:[self tableView] cellForRowAtIndexPath: indexPath];
    // Place checkbox to the right
    [checkmarkedCell setRightCheckmark: YES];
}

// Executes operation by key with specifying of parameters
-(void)performSettingsAction:(NSString *)key withParameter:(NSObject *)params {
    NSIndexPath *indexPath = [self indexPathForKey:key];
    SettingsCheckmarkedCell *checkmarkedCell = (SettingsCheckmarkedCell *)[self tableView:[self tableView] cellForRowAtIndexPath: indexPath];
    // Determine checkbox position
    [checkmarkedCell setRightCheckmark: [(NSNumber*)params boolValue]];
}

// Returns value text by key
- (NSString *)settingsTextForKey:(NSString *)key withValue:(NSObject *)value {
    NSString *result = [NSString string];
    if ([@"NUMBER4" isEqualToString: key]) {
        result = @"SettingsDetailTextTableViewCell";
    }
    return result;
}

// Controls displaying of edited value by key
- (BOOL) settingsControlVisibleForKey: (NSString *)key {
    BOOL result = YES;
    if ([@"NUMBER1" isEqualToString:key]) {
        result = YES;
    }
    else if ([@"NUMBER2" isEqualToString:key]) {
        result = YES;
    }
    else if ([@"NUMBER3" isEqualToString:key]) {
        result = YES;
    }
    else if ([@"NUMBER4" isEqualToString:key]) {
        result = YES;
    }
    return result;
}

// Controls permission to edit value by key
- (BOOL) settingsControlEnabledForKey: (NSString *)key {
    BOOL result = YES;
    if ([@"NUMBER1" isEqualToString:key]) {
        result = YES;
    }
    else if ([@"NUMBER2" isEqualToString:key]) {
        result = NO;
    }
    return result;
}

// Returns icon by key
- (UIImage *)settingsIconForKey:(NSString *)key {
    UIImage *image = nil;
    if ([@"NUMBER4" isEqualToString:key]) {
        image = [UIImage imageNamed: @"tool.png"];
    }
    return image;
}

// Returns minimum value by key
- (NSObject *)settingsMinValueForKey:(NSString *)key {
    NSObject *result = nil;
    if ([@"NUMBER1" isEqualToString:key]) {
        result = [self settingsValueForKey: key];
    }
    return result;
}

// Returns maximum value by key
- (NSObject *)settingsMaxValueForKey:(NSString *)key {
    NSObject *result = nil;
    if ([@"NUMBER2" isEqualToString:key]) {
        result = [self settingsValueForKey: key];
    }
    return result;
}

// Returns dictionary of possible pairs "text-value" for key
- (NSDictionary *)settingsValuesDictForKey:(NSString *)key {
    NSMutableDictionary *result = [NSMutableDictionary dictionary];
    if ([@"CustomController" isEqualToString:key]) {
        [result addEntriesFromDictionary:[NSDictionary dictionaryWithObject:@"SettingsSwitchTableViewCell" forKey:[NSNumber numberWithInt: 0]]];
        [result addEntriesFromDictionary:[NSDictionary dictionaryWithObject:@"SettingsDetailCheckmarkedCell" forKey:[NSNumber numberWithInt: 1]]];
        [result addEntriesFromDictionary:[NSDictionary dictionaryWithObject:@"SettingsSpinnerTableViewCell" forKey:[NSNumber numberWithInt: 2]]];
        [result addEntriesFromDictionary:[NSDictionary dictionaryWithObject:@"SettingsColorTableViewCell" forKey:[NSNumber numberWithInt: 3]]];
        [result addEntriesFromDictionary:[NSDictionary dictionaryWithObject:@"SettingsCheckmarkedColorCell" forKey:[NSNumber numberWithInt: 4]]];
        [result addEntriesFromDictionary:[NSDictionary dictionaryWithObject:@"SettingsCheckmarkedSpinnerCell" forKey:[NSNumber numberWithInt: 5]]];
    }
    return result;
}

// Updates component
-(void)historyUpdatedFromController {
    // Set new size and location of controller view
    UIView *customView = [self view];
    [customView setFrame:CGRectMake(50, 300, 300, 200)];
}

// Returns value options for key
- (NSArray *)settingsValuesEnumForKey:(NSString *)key {
    NSArray *result = nil;
    if ([@"NUMBER1" isEqualToString:key]) {
        result = @[[NSNumber numberWithInteger: NSTextAlignmentLeft],
        [NSNumber numberWithInteger: NSTextAlignmentCenter],
        [NSNumber numberWithInteger: NSTextAlignmentRight]],
        [NSNumber numberWithInteger: NSTextAlignmentJustified],
        [NSNumber numberWithInteger: NSTextAlignmentNatural];
    }
    return result;
}

// Handles event of tapping settings menu child cell transition button
-(void) detailDisclosureButtonClicked: (NSIndexPath *) indexPath {
    NSLog(@"Transition from cell (%d, %d)", [indexPath row], [indexPath section]);
}

// Handles event of tapping menu settings basic cell
-(void) settingsCellClick:(NSIndexPath *) indexPath {
    NSLog(@"Selected cell (%d, %d)", [indexPath row], [indexPath section]);
}

// Called after changing state of checkbox cell
- (void)checkStatusChangedInCell:(CheckmarkedCell *)cell {
    SettingsCheckmarkedCell *settingsCell = (SettingsCheckmarkedCell *)cell;
    NSLog(@"Current cell state%@: %d", [settingsCell key], [settingsCell checked]);
}

@end

See also:

Working with Cells in Settings Menu | Working with Cells and Sections in Settings Menu | Working with Cell Containing Checkbox