Как остановить UITableView от загрузки до тех пор, пока не будут получены данные?
Я понимаю, что UITableView
вызовет метод -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
, чтобы получить каждую из ячеек для представления таблицы. Скажем, что у меня есть источник данных, полученный из Интернета, и мне приходится учитывать задержку. Каким будет лучший способ "остановить" этот метод от вызова? Должен ли он блокировать логический флаг в приложении? Должен ли я просто вызвать cellForRowAtIndexPath
снова из моего приложения?
Я не уверен, когда вызвана функция, т.е. как часто UITableView
"обновляется". Любые объяснения будут полезны! Спасибо!
Ответы
Ответ 1
Если у вас нет данных или у вас нет данных для дополнительных ячеек, то cellForRowAtIndex:
не будет вызываться до тех пор, пока вы не укажете UTableView, что у вас есть rowCounts или новые rowCounts. Это значение устанавливается в numberOfRowsInSection:
.
Другими словами, не сообщайте о новых ячейках в numberOfRowsInSection:
, пока у вас на самом деле нет этих данных, а затем cellForRowAtIndexPath:
не будет вызван преждевременно.
Когда вы получите дополнительные данные строки, вызовите reloadData
, чтобы заставить UITableView запрашивать количество строк, а затем вызвать cellForRowAtIndex:
.
Ответ 2
Если вы установили UITableView
источник данных и делегат из IB, тогда он будет по крайней мере идти для метода numberOfRowsInSection
, когда вы нажимаете на представление, однако, если вы показываете данные из NSArray
, это будет return count ZERO, если массив все еще пуст, поэтому таблица не будет использовать другие методы для вызова.
На практике я извлекаю данные из веб-службы для подачи таблицы, поэтому я не настраиваю источник данных и делегировать из IB вместо того, как только получаю ответ на данные и статус OK
, я установил tableview.datasource = self
и tableview.delegate = self
, а затем вызовите метод reloadData
для обновления таблицы. Это гарантирует, что он не будет использоваться для метода numberOfRowsInSection
, поскольку вам не нужно вызывать его без наличия данных.
Ответ 3
Что вам нужно сделать, это вызвать reloadData в представлении таблицы, когда ваши данные будут получены. Это заставит представление таблицы снова вызвать его методы делегирования для отображения. Эти методы вызывается всякий раз, когда представление таблицы необходимо повторно отображать, поэтому либо когда оно появляется в поле зрения, происходит прокрутка, либо вы вручную вызываете reloadData.
Ответ 4
Когда вы вызываете [tableView reloadData]
, среда автоматически вызывает все методы источника данных снова для отображаемых в настоящее время ячеек таблицы (не для всех ячеек таблицы). Таким образом, лучшим подходом было бы вызывать reloadData каждый раз, когда вы получаете данные из Интернета.