Ответ заключается в том, что вы не должны добавлять подпредставления в ячейки таблицы за пределами предложения «if (cell == nil) {...», иначе они будут добавляться снова и снова в одну и ту же ячейку, когда она возвращается б.
См. Мой ответ на этот вопрос для более подробного объяснения, включая код, как это исправить:
cellForRowAtIndexPath управление памятью
Вы также не можете сохранить состояние в ячейках таблицы, потому что, как только они прокручиваются за пределы экрана, они перерабатываются и снова появляются с другим индексом в вашей таблице. Вам необходимо настроить массив объектов модели для хранения состояния ячеек таблицы (например, каков должен быть их тип аксессуара). Более подробное объяснение можно найти в моем ответе на этот вопрос:
Цикл по UITableViewCells UITableView
Если вы исправите способ добавления подпредставлений в ячейки и сохраните свое «помеченное» состояние в массиве объектов модели, а также зададите cell.accessoryType (чтобы его можно было восстановить при снятии очереди с ячейки), тогда ваш подход к выбору строки будет правильным.
Итак, поместите это в ваш tableView:cellForRowAtIndexPath:
метод, прямо перед return cell;
:
MyModelObject *object = [self.arrayOfModelObjects objectAtIndex:indexPath.row];
BOOL isChecked = object.checked;
cell.accessoryType = isChecked? UITableViewCellAccessoryCheckmark: UITableViewCellAccessoryNone;
А в вашем методе tableView: didSelectRowAtIndexPath:
избавьтесь от текущей логики и замените ее на:
- (void)tableView:(UITableView *)tableView1 didSelectRowAtIndexPath:(NSIndexPath *)indexPath
for (int i = 0; i < [self.arrayOfModelObjects count]; i++)
{
MyModelObject *object = [self.arrayOfModelObjects objectAtIndex:i];
object.checked = (i == indexPath.row); // only check the one we just tapped
}
//refresh table to update the accessory views for all rows
[tableView1 reloadData];
}
Очевидно, замените arrayOfModelObjects
вашей собственной реализацией модели. Вы можете просто использовать массив объектов NSNumber, содержащих bools, если вы не хотите создавать собственный класс для этой цели.