У вас есть структура таблицы в NSArray, поэтому я предлагаю вам создать NSDictionary для каждой строки, которая должна иметь сегментированный элемент управления, и добавить ее в структуру таблицы NSArray
Вам понадобятся три объекта внутри словаря. Заголовок, NSArray с именами сегментов, и вам нужен ключ, который вы используете для установки и получения выбранного индекса.
Я сделал нечто похожее для настроек viewcontroller в некоторых моих приложениях. Вот как выглядит NSDictionary:
[NSDictionary dictionaryWithObjectsAndKeys:
@"Value of Foo", kSettingsLabel, // for the textLabel
[UISegmentedControl class], kSettingsView, // which UIControl
@"foo", kSettingsKey, // the key for setValue:forKey: and valueForKey:
[NSArray arrayWithObjects: @"Green", @"Round", @"Auto",nil], kSettingsValue, // the titles of the segments
nil]
Вот как я настраивал UISegmentedControls в моем табличном представлении:
NSDictionary *dictionary = [[self.dataSourceArray objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
// omitted: check in the dictionary which cell we need... (I wrote it that it can use almost all UIControls)
// omitted: dequeue a cell with a UISegmentedControl ...
// configure cell:
NSArray *segmentTitles = [dictionary objectForKey:kSettingsValue];
UISegmentedControl *segment = (UISegmentedControl *)[cell viewWithTag:kTagSegment];
[segment removeAllSegments];
for (NSString *segmentName in segmentTitles) {
// if index is higher than number of indexes title is inserted at last available index.
// so first object in array is placed at first position in segmentcontrol
[segment insertSegmentWithTitle:segmentName atIndex:1000 animated:NO];
}
[segment setSelectedSegmentIndex:[[self valueForKey:[dictionary valueForKey:kSettingsKey]] intValue]];
//omitted: setup cell title ... and return cell
UISegmentedControl подключен к действию изменения значения, которое выглядит следующим образом:
NSIndexPath *indexPath = [self.settingsTable indexPathForCell:(UITableViewCell *)[[sender superview] superview]];
if (indexPath == nil)
return;
NSDictionary *dictionary = [[self.dataSourceArray objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
if ([sender isKindOfClass:[UISegmentedControl class]]) {
[self setValue:[NSNumber numberWithInt:((UISegmentedControl *)sender).selectedSegmentIndex] forKey:[dictionary valueForKey:kSettingsKey]];
}
и, конечно, вам также нужны сеттер и геттер для указанного ключа:
- (NSNumber *)foo {
return [NSNumber numberWithInt:someValue];
}
- (void)setFoo:(NSNumber *)n {
someValue = [n intValue];
}
Вы можете синтезировать их, но я хотел, чтобы в моем классе было значение int вместо NSNumbers, поэтому я сам написал установщик и получатель.
Большим преимуществом этого является то, что он полностью динамичный. Если вы хотите переставить ячейки, просто переместите их в массив (я использую plist, чтобы сделать это еще проще).
Это немного сложно, когда вы используете его в первый раз, но все становится довольно быстро. И вам не нужны пять разных .xibs и пять разных UISegmentedControls в интерфейсе вашего класса.