Загрузка многоразового UITableViewCell из пера - PullRequest
89 голосов
/ 05 января 2009

Я могу спроектировать пользовательские UITableViewCells и просто загрузить их, используя технику, описанную в потоке, найденном в http://forums.macrumors.com/showthread.php?t=545061. Однако использование этого метода больше не позволяет инициировать ячейку с помощью reuseIdentifier, что означает, что у вас есть создавать совершенно новые экземпляры каждой ячейки при каждом вызове. Кто-нибудь нашел хороший способ все еще кэшировать определенные типы ячеек для повторного использования, но все еще быть в состоянии проектировать их в Интерфейсном Разработчике?

Ответы [ 16 ]

119 голосов
/ 19 апреля 2009

На самом деле, поскольку вы строите ячейку в Интерфейсном Разработчике, просто установите там идентификатор повторного использования:

IB_reuse_identifier

Or if you are running Xcode 4, check the Attributes inspector tab:

enter image description here

(Edit: после того, как XIB сгенерирован вашим XIB, он содержит пустой UIView, но нам нужен UITableViewCell; поэтому вам нужно вручную удалить UIView и вставить ячейку табличного представления. Конечно, IB не будет показывать никакой UITableViewCell параметры для UIView.)

74 голосов
/ 05 января 2009

Просто реализуйте метод с соответствующей сигнатурой метода:

- (NSString *) reuseIdentifier {
  return @"myIdentifier";
}
66 голосов
/ 10 апреля 2012

Теперь в iOS 5 для этого есть подходящий метод UITableView:

- (void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifier
47 голосов
/ 19 июля 2009

Не могу вспомнить, где я первоначально нашел этот код, но до сих пор он отлично работал для меня.

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

    static NSString *CellIdentifier = @"CustomTableCell";
    static NSString *CellNib = @"CustomTableCellView";

    UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:CellNib owner:self options:nil];
        cell = (UITableViewCell *)[nib objectAtIndex:0];
    }

    // perform additional custom work...

    return cell;
}

Пример настройки Interface Builder ...

alt text

12 голосов
/ 05 января 2009

Посмотрите на ответ, который я дал на этот вопрос:

Можно ли проектировать подклассы NSCell в Интерфейсном Разработчике?

Не только возможно спроектировать UITableViewCell в IB, это желательно, потому что в противном случае все ручное подключение и размещение нескольких элементов очень утомительно. Производительность хороша, если вы по возможности стараетесь сделать все элементы непрозрачными. ReuseID устанавливается в IB для свойств UITableViewCell, затем вы используете соответствующий код повторного использования в коде при попытке удаления из очереди.

Я также слышал от некоторых докладчиков на WWDC в прошлом году, что вы не должны создавать ячейки табличного представления в IB, но это большая нагрузка.

7 голосов
/ 18 января 2011

Начиная с iOS около 4.0, в документации для iOS есть специальные инструкции, которые делают эту работу очень быстрой:

http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/TableView_iPhone/TableViewCells/TableViewCells.html#//apple_ref/doc/uid/TP40007451-CH7

Прокрутите вниз, где говорится о создании подклассов UITableViewCell.

6 голосов
/ 09 декабря 2011

Вот еще один вариант:

NSString * cellId = @"reuseCell";  
//...
NSArray * nibObjects = [[NSBundle mainBundle] loadNibNamed:@"CustomTableCell" owner:nil options:nil];

for (id obj in nibObjects)
{
    if ([obj isKindOfClass:[CustomTableCell class]])
    {
        cell = obj;
        [cell setValue:cellId forKey:@"reuseIdentifier"];
        break;
    }
}
2 голосов
/ 01 марта 2014
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *simpleTableIdentifier = @"CustomCell";

CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if (cell == nil)
{
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil];
    cell = [nib objectAtIndex:0];

    [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
}         

return cell;
}
2 голосов
/ 29 сентября 2010

Эта методика также работает и не требует использования фанк-ивара в вашем контроллере представления для управления памятью. Здесь ячейка пользовательского табличного представления находится в XIB с именем «CustomCell.xib».

 static NSData *sLoadedCustomCell = nil;

 cell = [tableView dequeueReusableCellWithIdentifier:@"CustomCell"];
 if (cell == nil) 
 {
   if (sLoadedCustomCell == nil) 
   {        
      // Load the custom table cell xib
      // and extract a reference to the cell object returned
      // and cache it in a static to avoid reloading the nib again.

      for (id loadedObject in [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:nil options:nil]) 
      {
        if ([loadedObject isKindOfClass:[UITableViewCell class]]) 
        {
          sLoadedCustomCell = [[NSKeyedArchiver archivedDataWithRootObject: loadedObject] retain];
          break;
        }
    }
    cell = (UITableViewCell *)[NSKeyedUnarchiver unarchiveObjectWithData: sLoadedCustomCell];
  }
2 голосов
/ 27 мая 2010

Некоторое время назад я нашел отличную запись в блоге на эту тему по адресу blog.atebits.com и с тех пор начал использовать класс Loren Brichter ABTableViewCell для выполнения всех моих UITableViewCells.

Вы получаете простой контейнер UIView для размещения всех ваших виджетов, а прокрутка молниеносна.

Надеюсь, это полезно.

...