2013-07-31 6 views
1

Как я понимаю, там, кажется, три способа прокладки пользовательского вида ячейки таблицы:Где создать пользовательский UITableViewCell: в layoutSubviews или initWithStyle: reuseIdentifier?

  1. В Interface Builder.
  2. В layoutSubviews.
  3. В initWithStyle:reuseIdentifier:.

В чем разница между вторым и третьим методами? Кроме того, почему не drawRect?

P.S. Я следую главе 9 книги Pro iOS Table Views by Tim Duckett, где мы строим обычай UITableViewCell. Автор показывает, как выложить ячейку в том же порядке, что и выше, но я не знаю, в чем разница между двумя последними, поскольку они оба уходят с IB. Я заметил, однако, что автор просто устанавливает рамки в layoutSubviews, в отличие от initWithStyle:reuseIdentifier:, где заданы свойства, относящиеся к виду вида (например, фоновое изображение, цвет фона и т. Д.).

+0

Я обычно делаю это, как описано в книге рецептов iOS. Это должно быть эквивалентно настройке в 'initWithStyle: reuseIdentifier:'. – dasdom

ответ

4

Вы должны создать свои ячейки подвидов в

- initWithStyle: (UITableViewCellStyle) style reuseIdentifier: (NSString*) resueIdentifier 

И макет их в layoutSubviews. Метод -initWithStyle:reuseIdentifier будет вызываться один раз при инициализации, но на данный момент у вас может быть неправильный кадр.

Вот почему вам нужно разместить его в методе layoutSubviews, его вызывают, когда ячейке необходимо обновить макет, например, при авторотации. Поэтому, если вы планируете использовать подпункты в этом методе, у вас будет действительный фрейм ячейки и правильная компоновка subviews.

+0

Так что мне не нужно переопределять 'layoutSubviews', если я поддерживаю только портретную ориентацию, правильно? –

+0

Нет, вам нужно. Даже если у вас есть только портретная ориентация, лучше иметь весь макет, определенный в этом методе. Кадр ячейки может быть некорректным в методе init (например, если у вас есть пользовательская высота ячейки и многие другие случаи). И не забудьте называть [super layoutSubviews] :) –

+0

Спасибо, я следил за советом о создании всего в 'initWithStyle: reuseIdentifier:' но еще не переопределял 'layoutSubviews'. Я, вероятно, просто ленив, но я не думаю, что 'layoutSubviews' когда-нибудь будет вызываться, когда приложение не делает пейзаж, а ячейка представления таблицы статична: http://stackoverflow.com/a/5330162/855680. В случае, указанном выше, это 'tableView: heightForRowAtIndexPath:', который имеет окончательное слово на высоте ячейки пользовательской таблицы.Как вы думаете? –

2
-[UIView layoutSubviews]

дает гораздо больше контроля на пути вид является relayout (я полагаю, в вашей книге, например это делается в contentView ячейки таблицы). Когда вы используете файл NIB, вы просто можете воссоздать в памяти иерархию представлений с некоторыми установленными свойствами, но у nib нет динамической возможности для ретрансляции ячейки (или она ограничена весной/структурой или автоматической компоновкой возможности). Если вы не используете NIB, вы должны создать эту иерархию программно.

Специально в подклассе ячеек таблицы вы можете добавить к нему многие свойства, которые могут изменить способ передачи ячеек, например. показывая уменьшенное изображение или нет, отобразите определенную метку или нет, и в таких случаях вам, вероятно, понадобится метод layoutSubviews для обновления раскладки ячеек с учетом всех возможных макетов из-за разных значений свойств.

Смежные вопросы