Обновить UITableViewCell без перезагрузки

#iphone #uitableview

#iPhone #uitableview

Вопрос:

Итак, вот моя ситуация:

У меня есть UITableView, где в каждой ячейке есть несколько кнопок.
В cellForRowAtIndexPath я устанавливаю indexpath строки, поэтому при нажатии кнопки a я знаю, какая строка была нажата.
Одна из кнопок — это кнопка удаления, и при нажатии я удаляю резервные данные и удаляю строку из таблицы.

Проблема, с которой я сталкиваюсь, заключается в том, что после удаления строки значения indexPath других строк неверны, поскольку другие строки не были перерисованы. Единственный способ, который я могу найти, чтобы перерисовать таблицу, — это вызвать reload, но это портит анимацию.
Я полагаю, что такого рода проблемы, должно быть, решались раньше. Есть ли у кого-нибудь предложения о том, как это обойти? Я согласен изменить способ работы моих кнопок, если есть способ получше.

Комментарии:

1. Вы когда-нибудь находили обходной путь для этого? Повторные загрузки и reloadSections стали для меня ужасной проблемой из-за нежелательных анимаций / вспышек, когда их не должно быть.

Ответ №1:

Думаю, вам нужно это использовать…

 - (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation
  

Ссылка на Apple!

Комментарии:

1. Я пытался использовать версию reloadSections (поскольку большая часть раздела неверна), но анимация в этом случае получается ужасной. Кажется, что вся таблица мигает, и я вижу белый цвет, который находится за таблицей.

2. Может быть, вам также нужно перезагрузить ячейки вокруг него? Какие данные стоят за этим, как будто вы используете CoreData, он обрабатывает многое из этого за вас.

Ответ №2:

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

 [tableView beginUpdates];
[tableView endUpdates];
  

Ответ №3:

вызовите метод: - (void)deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation

Комментарии:

1. Я вызываю этот метод. Это правильно удаляет, но не перерисовывает другие ячейки, поэтому пути к индексам неверны.

Ответ №4:

Лучше не сохранять indexPath с кнопками. В обработчике действия кнопки (который является либо методом в вашем подклассе cell, либо в вашем ViewController) вы могли бы идентифицировать ячейку и впоследствии определить indexPath с помощью -indexPathForCell: .

Комментарии:

1. Прошло много времени с тех пор, как я написал этот вопрос, но вы правы, и вот как я теперь справляюсь с этим.