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.

  • Как переформатировать пользовательский UITableViewCell в режиме редактирования для размещения элементов управления Delete?
  • Как использовать повторное использование ячеек в UITableViewSource в Xamarin?
  • Ошибка с помощью scrollsToTop и UIRefreshControl
  • Непредсказуемая задержка до появления UIPopoverController под iOS 8.1
  • Просмотр заголовка заголовка раздела в обычном uitableview
  • Должны ли мы использовать UITableView, когда у нас есть UICollectionView?
  • UITableView: выбор ячейки ячейки в смешанной ячейке таблицы статические и динамические ячейки
  • как добавить поисковую панель в uitableview?
  • Воспроизведение iTunes (приложение iOS) tableViewCell, которое просматривает песни
  • commitEditingStyle не запускается
  • Сохранение позиции прокрутки после перезагрузки в таблицеView
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.