Вы не можете отключить indexPath, потому что ячейки, которые ссылаются на вас, изменяются при прокрутке. Поместите NSLog в cellForRowAtIndexPath, чтобы увидеть это. Вы можете сделать проверку / снять галочку в willSelectRowAtIndexPath или didSelectRowAtIndexPath. Это охватывает только начальную проверку или снятие отметки, и также будет иметь вещи, которые будут проверены после прокрутки, потому что базовая ячейка для данного indexPath изменяется.
Таким образом, решение, которое я нашел, состоит в том, чтобы иметь массив выбранных вещей с чем-то, что является специфическим для данной ячейки, и выполнить первоначальную проверку.
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath];
if (![selectedIndexes containsObject:cell.textLabel.text]){
[selectedIndexes addObject:cell.textLabel.text];
cell.accessoryType = UITableViewCellAccessoryCheckmark;
} else {
[selectedIndexes removeObject:cell.textLabel.text];
cell.accessoryType = UITableViewCellAccessoryNone;
}
return indexPath;
}
Вы также должны иметь логику в cellForRowAtIndexPath, чтобы убедиться, что проверены правильные вещи или нет, когда прокручивается представление:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
...
cell.accessoryType = UITableViewCellAccessoryNone;
if ([selectedIndexes containsObject:cell.textLabel.text]) {
cell.accessoryType = UITableViewCellAccessoryCheckmark;
[cell setSelected:YES animated:YES];
}
return cell;
}