决议:见问题的底部。
我正在使用自定义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中创建表时,项目创建了空白单元格。
答案 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中创建表时,项目创建了空白单元格。