Контроллер для работы с ячейкой, содержащей флажок

Описание: контроллер для работы с настройками меню в формате «ключ-значение».

Файл «ElementsViewController.h»

#import "BaseSettingsViewController.h"
@interface ElementsViewController : BaseSettingsViewController<CheckmarkedCellDelegate>
// Обрабатывает событие нажатия на кнопку перехода к дочерней ячейке меню настроек
-(void) detailDisclosureButtonClicked: (NSIndexPath *) indexPath;
// Обрабатывает событие нажатия на базовую ячейку меню настроек
-(void) settingsCellClick:(NSIndexPath *) indexPath;
@end

Файл «ElementsViewController.m»

#import "ElementsViewController.h"

@implementation ElementsViewController

// Возвращает объект значения по ключу
- (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 = @"Заголовок таблицы";
    }
    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;
}

// Возвращает логическое значение по ключу
-(BOOL) settingsBoolValueForKey:(NSString *)key {
    NSObject *result = [self settingsValueForKey: key];
    return [((NSNumber*)result) boolValue];
}

// Возвращает целочисленное значение по ключу
-(int) settingsIntValueForKey:(NSString *)key {
    NSObject *result = [self settingsValueForKey: key];
    return [((NSNumber*)result) intValue];
}

// Возвращает вещественное значение по ключу
-(double) settingsDoubleValueForKey:(NSString *)key {
    NSObject *result = [self settingsValueForKey: key];
    return [((NSNumber*)result) doubleValue];
}

// Устанавливает объект значения по ключу
- (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]];
    }
}

// Устанавливает вещественное значение по ключу
-(void) setSettingsDoubleValue:(double)value forKey:(NSString *)key {
    NSNumber *doubleValue = [NSNumber numberWithDouble: value];
    [self setSettingsValue:doubleValue forKey: key];
}

// Устанавливает целочисленное значение по ключу
-(void) setSettingsIntValue:(int)value forKey:(NSString *)key {
    NSNumber *intValue = [NSNumber numberWithInt: value];
    [self setSettingsValue:intValue forKey: key];
}

// Устанавливает логическое значение по ключу
-(void) setSettingsBoolValue:(BOOL)value forKey:(NSString *)key {
    NSNumber *boolValue = [NSNumber numberWithBool: value];
    [self setSettingsValue: boolValue forKey: key];
}

// Возвращает путь к элементу в виде объекта типа NSIndexPath
- (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;
}

// Выполняет действие по ключу
- (void)performSettingsAction:(NSString *)key {
    NSIndexPath *indexPath = [self indexPathForKey:key];
    SettingsCheckmarkedCell *checkmarkedCell = (SettingsCheckmarkedCell *)[self tableView:[self tableView] cellForRowAtIndexPath: indexPath];
    // Флажок располагаем справа
    [checkmarkedCell setRightCheckmark: YES];
}

// Выполняет действие по ключу с указанием параметров
-(void)performSettingsAction:(NSString *)key withParameter:(NSObject *)params {
    NSIndexPath *indexPath = [self indexPathForKey:key];
    SettingsCheckmarkedCell *checkmarkedCell = (SettingsCheckmarkedCell *)[self tableView:[self tableView] cellForRowAtIndexPath: indexPath];
    // Определяем расположение флажка
    [checkmarkedCell setRightCheckmark: [(NSNumber*)params boolValue]];
}

// Возвращает текст для значения по ключу
- (NSString *)settingsTextForKey:(NSString *)key withValue:(NSObject *)value {
    NSString *result = [NSString string];
    if ([@"NUMBER4" isEqualToString: key]) {
        result = @"SettingsDetailTextTableViewCell";
    }
    return result;
}

// Управляет отображением редактируемого значения по ключу
- (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;
}

// Управляет разрешением на редактирование значения по ключу
- (BOOL) settingsControlEnabledForKey: (NSString *)key {
    BOOL result = YES;
    if ([@"NUMBER1" isEqualToString:key]) {
        result = YES;
    }
    else if ([@"NUMBER2" isEqualToString:key]) {
        result = NO;
    }
    return result;
}

// Возвращает значок по ключу
- (UIImage *)settingsIconForKey:(NSString *)key {
    UIImage *image = nil;
    if ([@"NUMBER4" isEqualToString:key]) {
        image = [UIImage imageNamed: @"tool.png"];
    }
    return image;
}

// Возвращает минимальное значение по ключу
- (NSObject *)settingsMinValueForKey:(NSString *)key {
    NSObject *result = nil;
    if ([@"NUMBER1" isEqualToString:key]) {
        result = [self settingsValueForKey: key];
    }
    return result;
}

// Возвращает максимальное значение по ключу
- (NSObject *)settingsMaxValueForKey:(NSString *)key {
    NSObject *result = nil;
    if ([@"NUMBER2" isEqualToString:key]) {
        result = [self settingsValueForKey: key];
    }
    return result;
}

// Возвращает справочник возможных пар «текст-значение» для ключа
- (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;
}

// Обновляет компонент
-(void)historyUpdatedFromController {
    // Устанавливам новые размеры и расположение представления контроллера
    UIView *customView = [self view];
    [customView setFrame:CGRectMake(50, 300, 300, 200)];
}

// Возвращает варианты значений для ключа
- (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;
}

// Обрабатывает событие нажатия на кнопку перехода к дочерней ячейке меню настроек
-(void) detailDisclosureButtonClicked: (NSIndexPath *) indexPath {
    NSLog(@"Переход из ячейки (%d, %d)", [indexPath row], [indexPath section]);
}

// Обрабатывает событие нажатия на базовую ячейку меню настроек
-(void) settingsCellClick:(NSIndexPath *) indexPath {
    NSLog(@"Выбрана ячейка (%d, %d)", [indexPath row], [indexPath section]);
}

// Вызывается после изменения состояния ячейки с флажком
- (void)checkStatusChangedInCell:(CheckmarkedCell *)cell {
    SettingsCheckmarkedCell *settingsCell = (SettingsCheckmarkedCell *)cell;
    NSLog(@"Текущее состояние ячейки %@: %d", [settingsCell key], [settingsCell checked]);
}

@end

См. также:

Работа с ячейками в меню настроек | Работа с ячейками и с секциями в меню настроек | Работа с ячейкой, содержащей флажок