2013-06-18 65 views
1

已解決:請參閱問題底部。UITableView不使用程序定製UITableViewCell

我爲我的程序定義的UITableView使用自定義的UITableViewCell。自定義的UITableViewCell目前有一個紅色的背景,沒有別的。下面是從UIViewController的的cellForRowAtIndexPath的片段:

- (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沒有被使用(不顯示或不被創建)在表中。相反,正在使用一個標準單元。

我看了很多其他問題,所有問題都通過我已經實施的步驟解決。

注意:在這個部分的分離是因爲這將是一個具有自己的CCTableViewCell實現的特定UITableViewController的父類。這部分具有繼承的通用代碼。

編輯:CCTableViewCell代碼添加

編輯++:

這是我的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]; 
} 

編輯++:該TableViewController是真正的UIViewController與委託和數據源建立

編輯:解決: 所以,事實證明,覆蓋willDisplayCell委託窩RKS。有關信息,請參閱下面的鏈接。

How to customize the background color of a UITableViewCell?

從本質上講,的cellForRowAtIndexPath似乎只能做的事情創建後的表。 willDisplayCell在單元顯示時工作。我的猜測是該項目在viewDidLoad中創建表格時創建了空白單元格。

+0

添加'CCTableViewCell'的代碼 – Wain

+0

嘗試替換此行: CCTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:CELL_ID]; 作者: 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

您是在您的tableView創建後運行registerClass:forCellReuseIdentifier:registerNib:forCellReuseIdentifier:?這是告訴你的表視圖在創建單元格時使用自定義類/筆尖。您可能會在視圖控制器的viewDidLoad方法中執行此操作。

從iOS 6開始dequeueReusableCellWithIdentifier:如果您使用register???:forCellReuseIdentifier:方法之一註冊了某個類,則始終返回一個單元格。以前,如果空閒單元不可用,它將返回零。如果您正在爲iOS 6構建,則不需要測試cell == nil

編輯: 您提到這是一個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(我不知道這是否已經完蛋了您)。你有沒有試過在tableView:cellForRowAtIndexPath:中添加一個NSLog以確保它被調用?

+0

見最近編輯 – DrDisc

+0

@Alex你的第一個段落是不正確的,如果你不使用的一個「registerXXX:forCellReuseIdentifier:」方法。 – rmaddy

+0

@rmaddy謝謝你的提示。我會編輯我的評論以反映這些信息。 – Alex

相關問題