2013-05-17 3 views
1

У меня есть таблица с 1 секцией и множеством строк. Каждая ячейка содержит некоторые ярлыки, поэтому я хочу получить их тексты. Моя проблема в том, что с кодом ниже я не могу получить ячейки после того, как я получу первые 5 ячеек. Странно, что я знаю. Чтобы быть ясным, если у меня есть 20 строк, я могу получить только 5 ячеек с кодом ниже, остальные 15 - null. Однако цикл for равен 20, первые 5 ячеек в порядке, но остальное пусто.Ячейки таблицы пусты в uitableview

Все строки такие же, что и пустая ячейка. Какая у меня ошибка?

 NSIndexPath *indexPath; 
     ReportTableCell *cell; 

     for (int i = 0; i < [_tableReport numberOfRowsInSection:0] ; i++) 
     { 
      indexPath = [NSIndexPath indexPathForRow:i inSection:0]; 

      cell = (ReportTableCell *)[_tableReport cellForRowAtIndexPath:indexPath]; 
     } 

ответ

1

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

От documentation:

cellForRowAtIndexPath: 

Возвращаемое значение
Объект, представляющий ячейку таблицы или ноль, если ячейка не видна или indexPath находится вне диапазона.

Доступ к ячейкам, которые на самом деле видны в данный момент, можно получить.

+0

да это правильно. Я могу видеть только 5 строк. Как я могу получить доступ ко всем ячейкам? – birdcage

+0

Вы не можете. Почему вы хотите это сделать? Вы должны создавать свои камеры «на лету», когда они становятся видимыми. – DrummerB

+0

Мне нужно объединить все тексты ярлыков ячеек и создать отчет. Что вы предлагаете? – birdcage

1

UITableView ставит в очередь ячейки для целей повторного использования. Это означает, что если у вас есть 100 строк, не гарантируется, что он создаст 100 ячеек. Как правило, он будет создавать только видимые ячейки, а затем повторно использовать их для остальной части отображаемых объектов. Это осуществляется как-то так:

static NSString *MyCellIdentifier = @"MyCellIdentifier"; 
UITableViewCell* cell = [tv dequeueReusableCellWithIdentifier:MyCellIdentifier]; 
//dequeueReusableCellWithIdentifier will give you the cells that has been added to queue after scroll and are ready for re-use. 
if(cell == nil){ 
    // create new. 
} 

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

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