UITableView没有使用程序化的自定义UITableViewCell

时间:2013-06-18 20:26:48

标签: ios uitableview customization

决议:见问题的底部。

我正在使用自定义UITableViewCell来编程定义UITableView。自定义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"
<。>中的

+ (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实现的特定UITableViewControllers的父类。这部分有公共的继承代码。

编辑:添加了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,其中设置了委托和数据源

编辑:已解决: 事实证明,覆盖willDisplayCell委托是有效的。有关信息,请参阅以下链接。

How to customize the background color of a UITableViewCell?

基本上,cellForRowAtIndexPath似乎只在创建表后执行操作。只要显示单元格,willDisplayCell就会起作用。我的猜测是,在viewDidLoad中创建表时,项目创建了空白单元格。

2 个答案:

答案 0 :(得分:0)

创建tableView后,您是在运行registerClass:forCellReuseIdentifier:还是registerNib:forCellReuseIdentifier:?这是告诉您的表视图在创建单元格时使用自定义类/ nib的原因。您可能会在视图控制器的viewDidLoad方法中执行此操作。

从iOS 6开始dequeueReusableCellWithIdentifier:如果您使用register???:forCellReuseIdentifier:方法之一注册了类,则始终返回一个单元格。以前,如果没有可用的免费单元,它将返回nil。如果您正在为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];
}

实际上,如果您使用的是UITableViewController,我可能不必设置delegate和dataSource属性(我不确定这是否已经为您完成)。您是否尝试在tableView:cellForRowAtIndexPath:中添加NSLog以确保它被调用?

答案 1 :(得分:0)

事实证明,覆盖willDisplayCell委托是有效的。有关信息,请参阅以下链接。

How to customize the background color of a UITableViewCell?

基本上,cellForRowAtIndexPath似乎只在创建表后执行操作。只要显示单元格,willDisplayCell就会起作用。我的猜测是,在viewDidLoad中创建表时,项目创建了空白单元格。