Описание: контроллер для работы с настройками меню в формате «ключ-значение».
#import "BaseSettingsViewController.h" @interface ElementsViewController : BaseSettingsViewController<CheckmarkedCellDelegate> // Обрабатывает событие нажатия на кнопку перехода к дочерней ячейке меню настроек -(void) detailDisclosureButtonClicked: (NSIndexPath *) indexPath; // Обрабатывает событие нажатия на базовую ячейку меню настроек -(void) settingsCellClick:(NSIndexPath *) indexPath; @end
#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
См. также:
Работа с ячейками в меню настроек | Работа с ячейками и с секциями в меню настроек | Работа с ячейкой, содержащей флажок