Удобный способ создания/повторного использования ячеек таблицы

Так выглядит стандартный способ создания/реиспользования ячейки (без custom XIB-интерфейса):

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
    if (cell == nil)
    cell = [[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"Cell"];
    // Add elements to the cell
    return cell;
}

Все к этому привыкли и наверняка почти все так и пишут. Лекго заметить, что этот код тягается из контроллера в контроллер и содержит в себе @ «Cell», от которого бы было здорово избавиться. Следущий класс взят из книги iOS-recipes и мне кажется очень удобным. Что он позволяет:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [LDBaseTableViewCell cellForTableView:tableView];
    //configure cell here
    return cell;
}

Казалось бы — уменьшили количество строк на одну, да избавились от захардкоженной строки. Но, пойдем дальше.

Положим, у нас есть кастомный целл из XIB-файла. Я не буду приводить код создания такого целла, все наверняка его видели и использовали. Что позволяет сделать LDBaseTableViewCell:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    KWBlockedUserCell *cell = [KWBlockedUserCell cellForTableView:tableView fromNib:self.blockedUserCellNib];
    //[self configureCell:cell atIndexPath:indexPath];
    return cell;
}

KWBlockedUserCell — наследник LDBaseTableViewCell, XIB файл с ячейкой должен называться также. В настройках XIB, reuseIdentifier должен совпадать с названием класса (KWBlockedUserCell в данном случае).

self.blockedUserCellNib — lazy getter, который выглядит следующим образом:

@property (nonatomic, retain) UINib *blockedUserCellNib;

- (UINib *)blockedUserCellNib { if (_blockedUserCellNib == nil) { self.blockedUserCellNib = [KWBlockedUserCell nib]; } return _blockedUserCellNib; }

Одна бабка сказала, что использовать класс UINib для ячеек достаточно неплохо и дает некоторое приемущество по сравнению с [[NSBundle mainBundle] loadNibNamed…

Вот и вся магия. Исходник на гисте (ARC-enabled).

Рейтинг
( Пока оценок нет )
webnewsite.ru / автор статьи
Загрузка ...

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: