UITableViewCell - Лучшее место для настройки ячейки - PullRequest
6 голосов
/ 27 февраля 2012

Я играл с пользовательскими ячейками в 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, но он, очевидно, вызывается не каждый раз, а только при повторном использовании ячеек.

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

Edit:

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

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

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

Ответы [ 3 ]

15 голосов
/ 27 февраля 2012

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

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

1 голос
/ 27 февраля 2012

В пользовательском классе ячеек укажите метод 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;
}
0 голосов
/ 27 февраля 2012

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

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

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

UPDATE

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

MORE

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...