2013-06-18 3 views
1

RESOLVED: см. Нижнюю часть вопроса.UITableView не использует программный пользовательский UITableViewCell

Я использую пользовательский UITableViewCell для моего программно определенного UITableView. Пользовательский UITableViewCell в настоящее время имеет красный фон и ничего больше. Вот отрывок из cellForRowAtIndexPath в UIViewController в:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CCTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CELL_ID]; 
    if (cell == nil) 
    { 
     cell = [self getNewCell]; 
    } 
    … 
    return cell; 
} 

- (CCTableViewCell *) getNewCell 
{ 
    return [CCTableViewCell newCell]; 
} 

код, связанный в CCTableViewCell:

в .h:

#define CELL_ID @"CCTVCell" 

в .m:

+ (CCTableViewCell *) newCell 
{ 
    CCTableViewCell * cell = [[CCTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CELL_ID]; 
    return cell; 
} 

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
{ 
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 
    if (self) { 
     [self initCell]; 
    } 
    return self; 
} 

- (CCTableViewCell *) init 
{ 
    self = [super init]; 
    if (self) { 
     [self initCell]; 
    } 
    return self; 
} 

- (void) initCell 
{ 
    [self setBackgroundColor:[UIColor redColor]]; 
} 

проблема заключается в том, что пользовательский UITableViewCell не используется (либо не отображается, либо не создается) в таблице. Вместо этого используется стандартная ячейка.

Я рассмотрел множество других вопросов, и все они решены с помощью шагов, которые я уже реализовал.

Примечание: Разделение частей в этом случае является тем, что это будет родительский класс для определенных UITableViewControllers с их собственными реализациями CCTableViewCell. Эта часть имеет общий код для наследования.

EDIT: код CCTableViewCell добавил

EDIT ++:

Это в моем UIViewController в viewDidLoad

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    UITableView *tableView = [[UITableView alloc] initWithFrame:CGRectMake(50, 100, 220, 300)]; 

    tableView.delegate = self; 
    tableView.dataSource = self; 
    tableView.allowsMultipleSelection = NO; 
    [tableView registerClass:[CCTableViewCell class] forCellReuseIdentifier:CELL_ID]; 
    [tableView reloadData]; 

    [self.view addSubview:tableView]; 
} 

EDIT ++: TableViewController действительно UIViewController с делегатом и источником данных, созданной

EDIT: RESOLVED: Итак, получается, что перезапись делегата willDisplayCell wo RKS. См. Ссылку ниже для информации.

How to customize the background color of a UITableViewCell?

По существу, cellForRowAtIndexPath, кажется, только делать вещи пост-создание таблицы. WillDisplayCell работает всякий раз, когда отображается ячейка. Я предполагаю, что проект создал пустые ячейки при создании таблицы в viewDidLoad.

+0

Добавить код для 'CCTableViewCell' – Wain

+0

попробуйте заменить эту строку: CCTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier: CELL_ID]; by: CCTableViewCell * cell = (CCTableViewCell *) [tableView dequeueReusableCellWithIdentifier: CELL_ID]; Я не уверен, если это причина ... не потеряет ничего, если вы попробуете .. удачи – DrDev

+0

я отредактировал свой комментарий – DrDev

ответ

0

Так получилось, что перезапись делегата willDisplayCell работает. См. Ссылку ниже для информации.

How to customize the background color of a UITableViewCell?

По существу, cellForRowAtIndexPath, кажется, только делать вещи пост-создание таблицы. WillDisplayCell работает всякий раз, когда отображается ячейка. Я предполагаю, что проект создал пустые ячейки при создании таблицы в viewDidLoad.

0

Вы работаете registerClass:forCellReuseIdentifier: или registerNib:forCellReuseIdentifier: после того, как ваш tableView был создан? Это то, что говорит вашему представлению таблицы использовать ваш пользовательский класс/nib при создании ячейки. Вероятно, вы сделаете это в методе viewDidLoad вашего контроллера.

Начиная с iOS 6 dequeueReusableCellWithIdentifier: всегда возвращает ячейку, если вы зарегистрировали класс, используя один из методов register???:forCellReuseIdentifier:. Раньше он возвращал бы нуль, если бы свободная ячейка не была доступна. Вам не нужно тестировать cell == nil, если вы строите для iOS 6.

EDIT: Вы упомянули, что это TableViewController. Я предполагаю, что это означает, что ваш контроллер просмотра является подклассом UITableViewController. Если это так, то уже есть экземпляр, если UITableView доступен через свойство tableView и нет необходимости создавать его в вашем методе viewDidLoad.Вместо этого я хотел бы изменить свой код, чтобы выглядеть следующим образом:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.tableView.delegate = self; 
    self.tableView.dataSource = self; 
    self.tableView.allowsMultipleSelection = NO; 
    [[self tableView] registerClass:[CCTableViewCell class] forCellReuseIdentifier:CELL_ID]; 
    [[self tableView] reloadData]; 
} 

На самом деле, вы не могли бы установить делегат и свойства DataSource, если вы используете UITableViewController (я не уверен, если это уже сделано для вы). Вы пробовали добавить NSLog в tableView:cellForRowAtIndexPath:, чтобы убедиться, что он называется?

+0

См. Последнее редактирование – DrDisc

+0

@Alex Ваш первый абзац неверен, если вы не используете один из «registerXXX: forCellReuseIdentifier:» методы. – rmaddy

+0

@rmaddy Спасибо за примечание. Я отредактирую свой комментарий, чтобы отразить эту информацию. – Alex

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