UITableView на самом деле не перезагружает свои данные, даже если методы источника данных возвращают новые данные - PullRequest
5 голосов
/ 18 марта 2011

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

[self.tableView reloadData]

ничего не меняется в таблице. Новых строк нет! В моих методах источника данных есть лог-операторы, подтверждающие, что после вызова reloadData таблица запрашивает, сколько строк и секций нужно нарисовать. Мой контроллер наверняка возвращает новое число строк, как и должно быть, но таблица, похоже, не заботится. Я также проверил, чтобы мой метод cellForRow ... возвращал правильный экземпляр ячейки, который был настроен с соответствующим объектом данных. У меня никогда не было этой проблемы раньше!

Я использую iOS 4.2 в симуляторе с приложением для iPad, созданным для 4.2.

Ответы [ 3 ]

1 голос
/ 29 марта 2011

Похоже, старая модель / представление путаницы. reloadData будет просто повторно отображать данные, которые уже находятся в источнике данных, а не загружаться в новые данные. Вы можете позвонить

[yourFetchedResultsController performFetch:&*error];

каждый раз, когда доступны новые данные, для немедленного обновления. Как вы видели, NSFetchedResultsController обновит свои результаты, но когда и как часто, это зависит от того, есть ли у него делегат и задано ли имя файла кэша. Я цитирую NSFetchedResultsController Ссылка класса:

Кроме того, NSFetchedResultsController обеспечивает следующие функции:

Опционально отслеживает изменения в объекты в связанном управляемом контекст объекта и сообщает об изменениях в результаты, установленные его делегату (см. «Делегат Контролера»). Это при желании кэширует результаты его вычисление, так что если те же данные Впоследствии переотображается, работа не нужно повторять (см. « Кэш»).

Контроллер, таким образом, эффективно имеет три режима работы, определяемых тем, имеет ли он делегата и установлено ли имя файла кэша.

  1. Нет отслеживания: делегат настроен на ноль. Контроллер просто обеспечивает доступ к данным, как это было, когда выборка была выполнена.

  2. Отслеживание только в памяти: делегат не ноль и имя кеша файла установлено до нуля Контроллер контролирует объекты в его наборе результатов и обновлений раздел и информация для заказа в ответ на соответствующие изменения.

  3. Полное постоянное отслеживание: делегат и имя кэша файла не ноль. Контроллер контролирует объекты в своем набор результатов и раздел обновлений и информация для заказа в ответ на соответствующие изменения. Контроллер поддерживает постоянный кэш результаты его расчета.

1 голос
/ 19 марта 2011

Возможно, у вас может быть несколько таблиц? Вы можете напечатать указатели таблицы из методов didSelectRowAtIndexPath: и cellForRowAtIndexPath: делегат. Включение описания вашего self.tableView также может пролить свет на проблему.

0 голосов
/ 19 мая 2011

Ваша высота строк> 0,0? Что возвращает tableView.visibleCells? Я бы проверил, что мои клетки имеют hidden != YES и что frame.size> (0x0)

...