Как остановить загрузку UITableView до тех пор, пока не будут получены данные? - PullRequest
23 голосов
/ 16 февраля 2010

Я понимаю, что UITableView вызовет метод -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath, чтобы получить каждую ячейку для табличного представления. Допустим, мой источник данных получен через Интернет, и я должен учитывать задержки. Что будет лучшим способом «остановить» этот метод от вызова? Должен ли он блокировать логический флаг в приложении? Должен ли я просто позвонить cellForRowAtIndexPath снова из моего приложения?

Я не уверен относительно того, когда вызывается функция, т. Е. Как часто UITableView обновляется. Любые объяснения будут полезны! Спасибо!

Ответы [ 4 ]

39 голосов
/ 16 февраля 2010

Если у вас нет данных или у вас нет данных для дополнительных ячеек, то cellForRowAtIndex: не будет вызываться, если вы не сообщите UTableView, что у вас есть rowCounts или новые rowCounts. Это значение устанавливается в numberOfRowsInSection:.

Другими словами, не сообщайте о каких-либо новых ячейках в numberOfRowsInSection:, пока у вас на самом деле не будут эти данные, и тогда cellForRowAtIndexPath: не будет вызываться преждевременно.

Когда вы получите дополнительные данные строки, затем вызовите reloadData, чтобы UITableView запросил количество строк, а затем вызовите cellForRowAtIndex:.

6 голосов
/ 16 марта 2013

Если вы установили UITableView источник данных и делегировали от IB, то при переходе к представлению он по крайней мере пойдет на метод numberOfRowsInSection, однако, если вы показываете данные с NSArray, он будет возвращаем счетчик ZERO, если массив все еще пуст, поэтому таблица не пойдет для вызова других методов.

На практике я извлекаю данные из веб-службы для подачи в таблицу, поэтому вместо настройки источника данных и делегата от IB я не получаю, как только получаю данные и статус OK В ответ я бы установил tableview.datasource = self и tableview.delegate = self, а затем вызовите метод reloadData для обновления таблицы. Это гарантирует, что он не пойдет на метод numberOfRowsInSection, так как вам не нужно вызывать его без данных.

1 голос
/ 16 марта 2013

Когда вы вызываете [tableView reloadData], платформа автоматически снова вызывает все методы источника данных для ячеек табличного представления, которые видны в данный момент (не для всех ячеек табличного представления). Поэтому лучшим подходом будет вызывать reloadData каждый раз, когда вы получаете данные из Интернета.

1 голос
/ 16 февраля 2010

Что вы должны сделать, это вызвать reloadData в вашем табличном представлении, когда ваши данные закончат извлекаться. Это заставит табличное представление снова вызывать его методы делегата для отображения. Эти методы вызываются всякий раз, когда табличное представление необходимо повторно отобразить, поэтому либо когда оно появляется, происходит прокрутка, либо вы вручную вызываете reloadData.

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