Так выглядит стандартный способ создания/реиспользования ячейки (без 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).
Сообщить об опечатке
Текст, который будет отправлен нашим редакторам: