Я новичок в кодировании iOS, я огляделся здесь в SO и попробовал несколько подходов для решения этой проблемы, но ничего не работает. Я стараюсь это из-за какой-то глупой ошибки моей :-)UISwitch в аксессуаре для каждой секции таблицы.
У меня есть секционный стол, всего около 25 строк, разделенный на 2 секции. Существует переключатель для каждого cell.accessoryView
, я пытаюсь сохранить состояние переключателя, когда он изменяется, в NSArray
, но запись содержимого массива по этому индексу странно возвращает 0
в любом случае. (Массив конкретизируется как свойство (nonatomic, readwrite)
в TableViewController
и синтезируется)
И очевидно, когда я прокручивать таблицу вверх и вниз, все переключатели вернуться в OFF
состояние по умолчанию.
Спасибо за помощь!
- (void)viewDidLoad
{
[super viewDidLoad];
//countries dict and switch state array init..
self.countries = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"countries" ofType:@"plist"]];
NSNumber *b = [NSNumber numberWithBool:NO];
for (int i=0; i<210; i++) {
[statiSwitch addObject:b];
NSLog(@"%d", [[statiSwitch objectAtIndex:i] integerValue]);
}
//tableview drawing..
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"CellWithSwitch";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
NSString *continent = [self tableView:tableView titleForHeaderInSection:indexPath.section];
NSString *country = [[self.countries valueForKey:continent] objectAtIndex:indexPath.row];
//Simple tag calculation...
NSInteger tagOb = indexPath.section * 100 + indexPath.row;
UISwitch *mySwitch = [[UISwitch alloc] initWithFrame:CGRectZero];
[mySwitch addTarget:self action:@selector(switchChange:) forControlEvents:UIControlEventValueChanged];
mySwitch.tag = tagOb;
if ([statiSwitch count] > tagOb) {
[mySwitch setOn:[[statiSwitch objectAtIndex:tagOb] boolValue] animated:NO];
}
cell.textLabel.text = country;
cell.accessoryView = mySwitch;
return cell;
}
И тогда метод называется при изменении состояния переключателя:
- (void) switchChange:(UISwitch *)sender {
NSNumber *c = [NSNumber numberWithBool:sender.on];
[statiSwitch replaceObjectAtIndex:sender.tag withObject:c];
NSLog(@"switch tag is: %i and state is: %d", sender.tag, sender.on);
NSLog(@"switch states array value: %d", [[statiSwitch objectAtIndex:sender.tag] integerValue]);
}
Try подклассов UITableViewCell, и хранить всю ячейку в массиве, а не только значение переключателя. Затем, когда свитки tableView вытаскивают ячейку из массива вместо dequeueing. – AMayes
Итак, я должен настроить массив со всеми (предположим) 20-клеточными объектами, включая вспомогательные ключи, а затем иметь таблицу таблиц '- (UITableViewCell *): (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath' метод выводит ячейки из этого массива? – Paolo83
И вы должны подклассифицировать UITableViewCell и обрабатывать действие переключателя в этом классе. Это похоже на использование класса объектов для хранения данных. – AMayes