TableView reloadData против beginUpdates & endUpdates - PullRequest
30 голосов
/ 18 ноября 2011

У меня сложная проблема с обновлением моего TableView, я получаю разные результаты, используя разные методы его обновления, позвольте мне объяснить:

Ситуация 1: Я использую [tbl reloadData];, где tbl - это мой TableView, чтобы обновить TableView - работает как задумано.

Ситуация 2: Я использую:

[tbl beginUpdates];
[tbl reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationRight];
[tbl endUpdates];

Где tbl - это мой TableView, а indexPaths - это массив, содержащий все indexPaths, присутствующие в TableView. Теперь с массивом все в порядке, он содержит все правильные indexPaths (проверенные дважды и трижды), но по какой-то причине - это работает не так, как задумано.

Теперь я понимаю, что это проблема XY (где я спрашиваю Y, но моя проблема действительно X, потому что я думаю, что решение Y решит X), и это только потому, что я чувствую, что объяснение X немного сложнее (следствие сказанного выше проблемы), поэтому я бы предпочел воздержаться от этого, если это возможно.

Итак, к моему вопросу: Есть ли разница между двумя способами обновления TableView (кроме битов анимации, конечно) или я должен подозревать, что проблема лежит в другом месте?

EDIT: Хорошо, я постараюсь объяснить, каковы симптомы:

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

btn.tag = indexPath.row;

Причина, по которой я это делаю, заключается в том, что я могу идентифицировать каждую кнопку, поскольку все они вызывают одну и ту же функцию:

- (void)btnPressed:(id)sender

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

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

Ответы [ 3 ]

21 голосов
/ 18 ноября 2011

Из UITableView документации

beginUpdates
Начните серию вызовов методов, которые вставляют, удаляют или выберите строки и разделы получателя.

Это означает, что вы не должны использовать это, если вы не вставляете, удаляете или выбираете. Вы не делаете ни одного из них.

Кроме того, вы должны заканчивать beginUpdates на endUpdates, а не reloadData. Документация:

Эта группа методов должна завершаться вызовом endUpdates.

5 голосов
/ 03 мая 2015

Первое различие между reloadData и reloadRowsAtIndexPaths состоит в том, что при выполнении reloadRowsAtIndexPaths 2 UITableViewCell объектам выделяются одновременно для одного и того же indexPath (потому что табличное представление «смешивается» в новой ячейке).Иногда это не предусматривается кодом в cellForRowAtIndexPath. Удивляет тот факт, что даже если ячейка уже была выделена для определенного идентификатора ячейки, табличное представление не возвращает эту ячейку в dequeueReusableCellWithIdentifier при вызове reloadRowsAtIndexPaths вместо этого возвращается ноль.В противовес этому reloadData повторно использует уже выделенные ячейки.

2-е отличие состоит в том, что endUpdates после reloadRowsAtIndexPaths напрямую вызывает cellForRowAtIndexPath (если вы установите точку останова, endUpdates будет виден втрассировка стека), тогда как reloadData планирует вызовы на cellForRowAtIndexPath позднее (не отображается в трассировке стека).

Однако вам потребуется опубликовать немного больше кода, чтобы дать нам представление о том, что вы там делаете.В принципе indexPath новых ячеек идентичны старым также с reloadRowsAtIndexPaths, если вы не удаляете и не вставляете строки.

1 голос
/ 16 июля 2015

Вызывайте этот метод, если хотите, чтобы последующие операции вставки, удаления и выделения (например, cellForRowAtIndexPath: и indexPathsForVisibleRows) были анимированы одновременно.

Я думаю, это то, что вы хотите. beginUpdates & endUpdates могут изменять UItableview с анимацией.

...