UITableViewCell – Лучшее место для настройки ячейки

Я играл с пользовательскими ячейками в UITableViewController, имея базовую ячейку (BaseCell – подкласс UITableViewCell), а затем подклассы BaseCell (Sub1Cell, Sub2Cell, оба подкласса BaseCell).

Поскольку подклассы используют одни и те же функции, если я полностью их настрою

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

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

 - (void)setupCell { self.picture.layer.cornerRadius = 5.0f; self.picture.layer.masksToBounds = YES; self.picture.layer.borderColor = [[UIColor lightGrayColor] CGColor]; self.picture.layer.borderWidth = 1.0f; } 

Я только что назвал это, когда создаю свою ячейку:

 Sub1Cell *cell = [tableView dequeueReusableCellWithIdentifier:statusCellIdentifier]; [cell setupCell]; 

Есть ли способ, который я могу использовать, который будет вызываться автоматически? Я попробовал – (void) prepareForReuse, но это, очевидно, не вызывается каждый раз и только при повторном использовании ячеек.

Какие-нибудь советы по наилучшему пути?

Редактировать:

Кажется, это действительно вызывает каждый раз, когда я вызываю tableView:cellForRowAtIndexPath . Я был немного смущен правильным способом создания пользовательской ячейки. Должен ли я делать что-то вроде:

 Sub1Cell *cell = [tableview dequeueReusableCellWithIdentifier:cellIdentifier]; if (!cell) { cell = [[Sub1Cell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; [cell setupCell]; } 

Если я не сделаю ничего с пройденным стилем, это повлияет на мою пользовательскую ячейку?

3 Solutions collect form web for “UITableViewCell – Лучшее место для настройки ячейки”

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

Если вы используете прототипы, то вся if (cell == nil) исчезнет, ​​UITableView обрабатывает все, что для вас в методе dequeue.

В пользовательском классе ячеек, чтобы инициализировать метод init. некоторые коды, как показано ниже:

 - (id)initWithReuseIdentifier:(NSString *)cellIdentifier { if (self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]) { self.picture.layer.cornerRadius = 5.0f; self.picture.layer.masksToBounds = YES; self.picture.layer.borderColor = [[UIColor lightGrayColor] CGColor]; self.picture.layer.borderWidth = 1.0f; } return self; } 

Это выглядит нормально. Пока вы вызываете его только при создании ячейки, а не в каждом прохождении через tableView:cellForRowAtIndexPath: Не уверен, что вы делаете из своего образца кода.

Вы можете попытаться поместить свой код в drawRect вашей пользовательской ячейки: посмотреть, что произойдет. Обратите внимание, что это может стать сложным для пользовательских ячеек; вам может потребоваться подумать о настройке layoutSubviews .

Кроме того, для того, что стоит, установка этих свойств CALayer может иметь эффект замедления из-за внеэкранного рендеринга, но я думаю, что это не будет большой проблемой для вас, как будто это должно происходить только при создании ячейки.

ОБНОВИТЬ

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

БОЛЬШЕ

Ознакомьтесь с документами от Apple. Я не уверен, что эффект прохождения стиля ячейки … если в вашем переопределении initWithStyle:reuseIdentifier: вы передаете стиль супер, тогда да, я бы подумал, что супер будет использовать его для настройки содержимого содержимого ячейки. Если вы затем измените представление контента своими собственными вещами, супер работает впустую. Что касается остальной части кода, которую вы добавили в разделе «Редактировать», я думаю, это выглядит хорошо.

Для чего это стоит, всякий раз, когда я это делаю, я использую InterfaceBuilder.

  • UILabel над UIProgressView с несколькими цветами
  • пользовательский стиль только для первой строки таблицы
  • Как предотвратить нежелательные анимации в UITableViewCell при анимации UITableView
  • Переход к детальному представлению из ячейки таблицы со списком с помощью Xcode Storyboard
  • Определить размер финального макета для просмотра с гибкой шириной в UITableViewCell
  • UITableViewCellAccessoryCheckmark не отображается в iOS 7
  • IOS UITableViewCells все перепутались в первой ячейке, устройство Iphone5S, хотя 64-битный симулятор
  • Обработка касаний для вложенных прокруток UIScrollViews в одном направлении
  • Группировка UITableview удаляет внешнюю разделительную линию
  • Как добавить HeaderView в UICollectionView, например, таблицу UITableView tableHeaderView
  • Пользовательский UITableViewCell: у первой строки нет содержимого
  • Interesting Posts

    iOS CoreData – существуют ли какие-либо недостатки, позволяющие использовать sqlite WAL / Write-Ahead Logging

    iOS 7 добавила слайд вправо, чтобы вытащить контроллер представления из стека. Можно ли добавить его назад, скользя влево?

    Неверный внутренний размер атрибутного текста в ярлыке

    Swift 2.0 вызывает функцию struct извне

    Приложение зависает при загрузке файла с сервера

    Как создать представление с кнопкой закрытия над углом?

    Размеры UIBarButtonItem различаются

    AFNetworking Domain = NSURLErrorDomain Code = -1001 «Тайм-аут запроса»

    Что такое доступность и особенности?

    Что вызывает метод setSelected: NO автоматически

    Имитировать событие UIButton Click, используя код

    Есть ли способ запустить код при отправке локального уведомления?

    реализация протоколов в AppDelegate.m: "атрибут prefix должен сопровождаться интерфейсом или протоколом"

    Firebase для iOS, свойство GoogleService-Info.plist "IS_ANALYTICS_ENABLED" установлено в "NO"

    Класс GAD_GTMStringEncoding реализуется как в <framework>, так и в <app>. Один из двух будет использован. Какой из них не определен

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.