UITableView reloadRowsAtIndexPaths: (NSArray *) indexPaths не может вызвать перезагрузку, если вы не вызываете его дважды? - PullRequest
7 голосов
/ 05 апреля 2011

У меня есть UITableViewController, управляющий объектом UITableView в приложении для iPad.Представление таблицы связано с довольно сложным созвездием других объектов.У меня возникает проблема, когда я прошу его перезагрузить строку следующим образом:

//indexPath is an NSIndexPath with indexes 0 and 0.  At the moment, this is the only cell in the table view.
NSArray *array = [NSArray arrayWithObject:indexPath]; 
[self.tableView reloadRowsAtIndexPaths:array withRowAnimation:UITableViewRowAnimationNone]; 

Проблема в том, что строка не перезагружается.Никогда не происходит обратного вызова cellForRowAtIndexPath.

Сумасшедшая вещь в том, что если я дважды вызываю reloadRowsAtIndexPaths, второй вызов вызывает перезагрузку:

//indexPath is an NSIndexPath with indexes 0 and 0.  At the moment, this is the only cell in the table view.
NSArray *array = [NSArray arrayWithObject:indexPath]; 
[self.tableView reloadRowsAtIndexPaths:array withRowAnimation:UITableViewRowAnimationNone];   // does not reload
[self.tableView reloadRowsAtIndexPaths:array withRowAnimation:UITableViewRowAnimationNone];   // does reload

Мне интересно, имел ли кто-нибудь ещестолкнулся с такой ошибкой, и если да, то в чем причина?

Ответы [ 2 ]

6 голосов
/ 05 апреля 2011

reloadRowsAtIndexPaths:... работает только при переходе между вызовами:

- (void)beginUpdates;
- (void)endUpdates;

Вне этого поведение не определено.(и, как вы обнаружили, довольно ненадежный).

Редактировать: цитирование соответствующей части "Руководства по программированию табличного представления для iPhone OS":

Чтобы анимировать пакетную вставку и удалениестрок и разделов, вызовите методы вставки и удаления в блоке анимации, определяемом последовательными вызовами beginUpdates и endUpdates.Если вы не вызываете методы вставки и удаления в этом блоке, индексы строк и разделов могут быть недействительными.Блоки beginUpdates ... endUpdates не являются вложенными.

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

reloadSections: withRowAnimation: и reloadRowsAtIndexPaths: withRowAnimation: методы, которые были введены в iPhone OS 3.0, связаны сметоды, обсужденные выше.Они позволяют запрашивать представление таблицы для перезагрузки данных для определенных разделов и строк вместо загрузки всего видимого представления таблицы путем вызова reloadData.

2 голосов
/ 26 февраля 2013

Я знаю, что эта тема довольно старая, но я столкнулся с той же проблемой и простым исправлением. У меня было табличное представление, и когда я вызывал reloadData и / или reloadRowsAtIndexPaths, метод tableView cellForRowAtIndexPath не срабатывал.

Оказывается, я не подключил свой IBOutlet к просмотру таблиц в Интерфейсном Разработчике - как только это было подключено, все сработало, как ожидалось. Это всегда мелочи ...

Также, как уже упоминали другие, если вам нужен только один вызов, заключать его в begin / endUpdates не нужно.

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