UITableView создан для отражения «модели», поэтому никогда не пытайтесь
изменить данные / представления для ячейки самостоятельно после того, как вы ее построите или будете ссылаться на ячейку на основе порядкового номера и т. п., создайте массив ваших данных, я обычно создаю отдельный объект CellViewEntity, который содержит все необходимые мне данные в ячейке как заголовок, подробный текст и т. д., но также и такие вещи, как поведение, он расширен, имеет ли он особый вид и т. д.
Затем я создаю UIView CellView, который заполняется необходимой графикой и методами, например, - (void) shouldDisplayCheckmark: (BOOL) значение и так далее.
Я устанавливаю тег объекта CellVIew - [cellView setTag: 15] и освобождаю CellView. Теперь я могу ссылаться на него позже, не сохраняя его, и пусть UITableVIew решит, что следует освободить / сохранить.
cellForRowAtIndexPath постоянно вызывается SDK при прокрутке при обновлении, когда ячейка входит или выходит из экрана. Так что не вкладывайте в эту функцию тяжелые экземпляры, веб-вызовы и т. Д.
В этом блоке if.
if(nil == cell){
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"rssItemCell"]autorelease];
}
Я создаю экземпляр ячейки и CellView и добавляю объект CellView к представлению ячейки.
(с тегом)
вне if (cell == nil) Я обновляю CellVIew только данными из массива модели.
Это означает, что если ячейка существует, она будет использоваться повторно, и ее свойства будут обновлены из массива, если она не создана и не присоединена к ячейке.
Вне оператора if я ссылаюсь на свой CellView следующим образом:
[(CellView*)[cell viewWithTag:15] updateValuesAccordingToModelArray:[array objectAtIndes:indexPath.row]]; //this will be the only code executed for a already existing cell.
Полагаю, это может показаться немного превышающим лимит, но вы не можете ссылаться на ячейки, подобные этой [uitableView cellAtRow: 14], согласованным образом, потому что UITableView кэширует ячейку, которая находится за пределами экрана, и соответственно изменяет indexPath. Такой подход вы можете сделать со своим массивом.
Теперь перестанет бродить :) ... отделить все данные в удобном пакете, поддерживающем tableView, и передать их в представление таблицы - только в одну сторону.