2013-11-01 2 views
1

У меня есть UITableView, который я заполняю данными, поступающими с веб-службы. Я использую круговой буфер для кэширования свежих данных и удаления старых, поэтому память не перегружается. Всякая магия возникает, когда представление таблицы вызывает cellForRowAtIndexPath, а контроллер вида справляется с буфером для получения данных. Кроме того, правильная реализация основана на том факте, что представление таблицы будет вызывать этот метод только тогда, когда ячейка станет видимой на экране. Если данные доступны, я возвращаю их в контроллер просмотра, если нет, я возвращаю nil, какой диспетчер представлений знает, как обращаться, и начните получать нужные данные. После того, как выборка завершена, я вызываю «reloadData» в таблице, и появляются данные.UITableView запрашивает ячейку, которая не отображается на экране

У меня странная проблема, из ниоткуда, даже если пользователь прокручивается до 200-й строки, представление таблицы запрашивает контроллер вида для строки в нулевом указателе или одном. В этот момент, что показано, неправильно, учитывая реализацию буфера &.

Просто, чтобы проиллюстрировать, с выходом отладчика внутри cellForRowAtIndexPath:

po indexPath <NSIndexPath: 0xb02b100> {length = 2, path = 0 - 0} 

po [self.tableView indexPathsForVisibleRows] <__NSArrayM 0x9b8f7f0>(<NSIndexPath: 0x9b42910> {length = 2, path = 0 - 19}, <NSIndexPath: 0x9b82080> {length = 2, path = 0 - 20}, <NSIndexPath: 0x9b6e2a0> {length = 2, path = 0 - 21}, <NSIndexPath: 0x9b39010> {length = 2, path = 0 - 22}, <NSIndexPath: 0x9b42d80> {length = 2, path = 0 - 23}, <NSIndexPath: 0x9b98a20> {length = 2, path = 0 - 24}, <NSIndexPath: 0x9b9dc50> {length = 2, path = 0 - 25}, <NSIndexPath: 0x9b9e4d0> {length = 2, path = 0 - 26}, <NSIndexPath: 0x9b40740> {length = 2, path = 0 - 27}, <NSIndexPath: 0x9b40750> {length = 2, path = 0 - 28}, <NSIndexPath: 0x9b88150> {length = 2, path = 0 - 29}, <NSIndexPath: 0x9b88160> {length = 2, path = 0 - 30}, <NSIndexPath: 0x9b97120> {length = 2, path = 0 - 31}, <NSIndexPath: 0x9b97130> {length = 2, path = 0 - 32}, <NSIndexPath: 0x9b44cf0> {length = 2, path = 0 - 33}, <NSIndexPath: 0x9b44d00> {length = 2, path = 0 - 34}, <NSIndexPath: 0x9b8d580> {length = 2, path = 0 - 35}, <NSIndexPath: 0x9b8d590> {length = 2, path = 0 - 36}) 

Кто-нибудь сталкивался с таким странным вопросом?

ответ

0

Элемент таблицы viewForRowAtIndexPath: не вызывается только для захвата ячеек, которые должны быть видимыми; в представлении таблицы обычно хватает несколько дополнительных ячеек, чтобы они были готовы к тому, когда пользователь прокручивается.

Чтобы убедить себя, зарегистрируйте возвращаемое значение для cellForRowAtIndexPath :. Если видно 6 ячеек, я делаю ставку cellForRowAtIndexPath: вызывается более 6 раз.

+0

Я не понимаю, почему это можно было бы назвать более 6 раз? willShowCellAtIndexPath также регистрирует отображение indexPath с строкой 0. – foFox

+0

Структура представления таблиц буферизует свои ячейки таблицы. Что касается того, почему представление таблицы запрашивает строку 0, когда вы находитесь в нижней части таблицы, я не могу дать окончательный ответ. – bilobatum

Смежные вопросы