1

已解决:见问题底部。

我正在为我以编程方式定义的 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"

在他们中:

+ (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 实现。这部分有继承的通用代码。

编辑:添加 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];
}

EDIT++:TableViewController 是真正的 UIViewController,设置了委托和数据源

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

如何自定义 UITableViewCell 的背景颜色?

从本质上讲, cellForRowAtIndexPath 似乎只在表创建后做一些事情。只要显示单元格,willDisplayCell 就会工作。我的猜测是该项目在 viewDidLoad 中创建表格时创建了空白单元格。

4

2 回答 2

0

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

从 iOS 6 dequeueReusableCellWithIdentifier 开始:如果您使用其中一种register???:forCellReuseIdentifier:方法注册了一个类,则始终返回一个单元格。以前,如果没有可用的单元格,它将返回 nil。cell == nil如果您正在为 iOS 6 构建,则无需测试。

编辑:你提到这是一个 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,您可能不必设置委托和数据源属性(我不确定这是否已经为您完成)。您是否尝试过添加 NSLogtableView:cellForRowAtIndexPath:以确保它被调用?

于 2013-06-18T20:32:13.353 回答
0

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

如何自定义 UITableViewCell 的背景颜色?

从本质上讲, cellForRowAtIndexPath 似乎只在表创建后做一些事情。只要显示单元格,willDisplayCell 就会工作。我的猜测是该项目在 viewDidLoad 中创建表格时创建了空白单元格。

于 2013-06-19T12:47:36.037 回答