iPhone UISwitch и TableView сохраняют состояние - PullRequest
2 голосов
/ 12 июля 2011

Я пытаюсь положить UISwitch в UITableView.Я посмотрел на этот вопрос здесь и здесь .Поскольку табличное представление повторно использует ячейки, мне нужно сохранить состояние ячеек.Я достигаю этого, имея NSMutableDictionary, где строка ячейки отображает состояние (true или false) UISwitch.Проблема, с которой я сталкиваюсь, заключается в определении индекса UISwitch в TableView.Я думаю, что-то не так с оператором @selector.Это сводит меня с ума в течение последних 2 часов.Это правильный способ сделать это и почему я изменяю состояние любого UIS-переключателя, о котором он всегда сообщает, с одним и тем же сообщением журнала (см. Ниже).Любая помощь очень ценится.Вот некоторые фрагменты моего кода ....

cellForRowAtIndexPath

//Need to construct
if (cell == nil) 
{ 
    cell = [[[UITableViewCell alloc]
             initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    UISwitch *temp = [[[UISwitch alloc] initWithFrame:CGRectZero] autorelease];

    //Add a callback when the value is changed
    [temp addTarget:self action:@selector(switchButtonChanged:forEvent:) forControlEvents:UIControlEventValueChanged];

    //Set the acessory view to the UISwitch
    cell.accessoryView = temp;
}

Метод обратного вызова

- (void)switchButtonChanged:(id)sender forEvent:(UIEvent *)event
{
    UISwitch *tempSwitch = (UISwitch *) sender;
    NSIndexPath *indexPath = [tableView indexPathForRowAtPoint:[[[event touchesForView:sender] anyObject] locationInView:tableView]];

    NSNumber *isChecked = [[[NSNumber alloc] initWithBool:tempSwitch.on] autorelease];
    NSNumber *row = [[[NSNumber alloc] initWithInteger:indexPath.row] autorelease];

    [self.selectedItems setObject:isChecked forKey:row];

    NSLog(@"Row %@ is now %@", row, [self.selectedItems objectForKey:row]);
}

Журнал

Row 0 is now (null)
Row 0 is now (null)
Row 0 is now (null)

Ответы [ 2 ]

2 голосов
/ 12 июля 2011

Как правило, самый простой способ справиться с этим - вставить что-то непосредственно в созданный вами UIS-переключатель, чтобы вы могли получить информацию непосредственно с коммутатора.

Удобно, UIS-переключатель, являющийся подклассомUIControl, и, следовательно, UIView, имеет атрибут тега, который является целым числом, которое можно использовать для хранения любого необходимого значения.

Вы будете устанавливать значение тега в ячейке каждый раз, когда cellForRowAtPath: isвызывается (не только при создании новой ячейки, но и при повторном использовании существующей ячейки), а также убедитесь, что вы изменили состояние переключателя UIS.

iOS обеспечит создание новых и существующих ячеекиспользуются повторно, поэтому вам не нужно беспокоиться о чрезмерном использовании или дублировании.

В методе обратного вызова извлеките значение «row» из тега (где вы сохранили его в cellForRowAtPath :) ииспользуйте это для доступа к словарю.

Также, как уже упоминалось в предыдущих комментариях, убедитесь, что вы инициализировали оба NSMutableDicи любые значения по умолчанию, которые вы хотите там.

Надеюсь, это поможет.

1 голос
/ 12 июля 2011

Наиболее вероятная причина в том, что self.selectedItems равно nil. Вы, возможно, не инициализировали это. Возможно, вы захотите поставить

self.selectedItems = [NSMutableDictionary dictionary];

в методе viewDidLoad.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...