iOS повторное использование / кэширование пользовательских представлений в качестве ячеек таблицы

Я использую специально созданный вид, чтобы сидеть на фоне UITableCells, Все хорошо, но есть небольшая задержка, связанная с созданием нового экземпляра представления каждый раз. Я пытаюсь решить эту проблему, используя следующий подход:

  • Использование одноэлементного объекта, который содержит словарь, в котором хранятся представления.
  • При создании фонового представления ячейки используйте значение из словаря, если оно есть, в противном случае создайте новое представление и сохраните его внутри словаря.

@implementation Cacher

@static Cacher *shared

+(Cacher) sharedInstance{

 if(shared == nil){
  shared = [[super alloc]init];
  shared.viewsDictionary = [[NSMutableDictionary] alloc]init];
 }

 return shared;
{

Другой класс

+(UIView*) getCellBackgroundForKey:(NSString*)key{

  UIView *view = [[Cacher sharedInstance].viewDict objectForKey:key];
  if(!view){

  view = [[CellBackgroundView alloc]initWithFrame:...];
  [[BPPViewsCacher sharedInstance].viewsDict setObject:view forKey:key];

  }

  return view;
}

Затем getCellBackgroundForKey называется внутри cellForRowAtIndexPath поставить фон ячейки.

 -(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath{

 UITableViewCell *cell =[tableView dequeReusableCel....];
if(!cell){
cell = [self makeCell:indexPath];
}
//add properties to cell
...
//key is a value generated based on the type of the cell
cell.backgroundView = [ViewMaker getCellBackgroundForKey:key];

}

Проблема заключается в том, что случайным образом некоторые фоны ячеек не отображаются. Как половина клеток имеет bacgkrounds, а другая половина - нет. Я не заметил какой-либо закономерности в этом, и все журналы выглядели нормально, то есть нет нулевых объектов. Как я могу это исправить?

0 ответов

Другие вопросы по тегам