2014-01-31 3 views
0

Раньше я создавал пользовательские ячейки без прототипа, только пользовательский класс, регистрировал этот класс для повторного использования с моим UITableView и использовал это.Инициализация прототипа UITableViewCell

В этом случае я использовал: - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier, и это сработало отлично (за исключением UITableViewHeaderFooterView, они никогда не знали свой кадр, хотя этот метод был вызван, кадр был 0 0 0 0 - но это не мой вопрос здесь).

Теперь я создавал некоторые пользовательские UITableViewCells с помощью Interface Builder. Создал свой собственный класс, подключил выходы из Interface Builder к моему пользовательскому классу, и я заметил, что вызывается - (id)initWithCoder:(NSCoder *)aDecoder, и именно здесь мне нужно внести изменения. НО, я не смог. Это единственный метод init, который вызывается, но если я попытаюсь изменить шрифт моей метки там, он не будет изменен. Я также попытался объединить прямоугольную кнопку, но это тоже не работает (моя кнопка также имеет фрейм 0 0 0 0 - еще не существует) в этом методе.

Мой вопрос: где я должен изменять такие вещи, как шрифт, цвет фона элементов, созданных с использованием прототипов?

ответ

3

(id)initWithCoder:(NSCoder *)aDecoder - правильный инициализатор.

Попробуйте это:

@implementation TESTCell 

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super initWithCoder:aDecoder]; 
    if (self) { 
     self.textLabel.font = [UIFont boldSystemFontOfSize:25.0f]; 
    } 
    return self; 
} 

@end 

Другие настройки (собственных подвидов) идет в:

- (void) awakeFromNib 
{ 
    [self.myButton setTitle:@"Hurray" forState:UIControlStateNormal]; 
} 

Он прекрасно работает. Конечно, вы должны установить идентификатор ячейки в вашем файле StoryBoard или Interface Builder для того же идентификатора, который вы используете в своем UITableViewController.

Я использую этот кусок кода в моей UITableViewController:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"TESTCell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 
    cell.textLabel.text = @"TEST"; 
    return cell; 
} 
+0

Dobar дан. Это именно то, что я говорил. Если я попытаюсь настроить что-то в этом методе init, он не выполняет эту работу. Представьте, что у вас есть кнопка в ячейке прототипа, созданная с помощью Interface Builder. Кнопка подключается через розетку к вашему специальному классу для этой прототипной ячейки. Если вы попытаетесь изменить фон этой кнопки в initWithCoder, ничего не произойдет. Если вы NSLog (@ "% f", self.customButton.frame.size.width), вы получите 0, даже если это не так. Единственный способ переопределить это - создать мою собственную функцию - (void) customizeCell и вызвать ее после [dequeueReusable ...] каждый раз. – jovanjovanovic

+0

Я вижу. Вы должны включить эту настройку в awakeFromNib. Я отредактировал свой ответ выше. Перед awakeFromNib ваши пользовательские подзаголовки еще не загружены. – akw

+0

Теперь вот ответ, который я искал. Спасибо, сэр. Хвала! – jovanjovanovic

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