我已根据有用的指导创建了一个自定义UITableViewCell
从xib文件加载它; How do you load custom UITableViewCells from xib files
我只想在UITableView
的第一行使用此自定义单元格,其他的是简单标签,标准UITableViewCell
就可以了。
问题是当我包含自定义单元格时,整个UITableView
未显示,除导航元素外,屏幕为空白。只使用标准单元格,表格显示正常,因此它与自定义单元格有关。
以下是我必须返回单元格的代码;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
if(indexPath.row == 0) {
ArticleDetailCell *cell = (ArticleDetailCell *)[tableView dequeueReusableCellWithIdentifier:[NSString stringWithFormat:@"%@Detail", reuseIdentifier]];
if(!cell) {
// Load the top-level objects from the custom cell XIB.
NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"ArticleDetailCell" owner:self options:nil];
// Grab a pointer to the first object (presumably the custom cell, as that's all the XIB should contain).
cell = (ArticleDetailCell *)[topLevelObjects objectAtIndex:0];
}
[[(ArticleDetailCell *)cell judges] setText:[[self caseBaseArticle] judges]];
[[(ArticleDetailCell *)cell judgementDate] setText:[[self caseBaseArticle] judgmentDate]];
[[(ArticleDetailCell *)cell court] setText:[[self caseBaseArticle] court]];
return cell;
} else {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
if(!cell) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier] autorelease];
[[cell textLabel] setNumberOfLines:1];
[[cell textLabel] setFont:[UIFont systemFontOfSize:14]];
[[cell textLabel] setText:articleRowTitles[indexPath.row-1]];
}
if ([self tableRowHasContentDetail:indexPath]) {
[self enableTableCell:&cell];
}else {
[self disableTableCell:&cell];
}
return cell;
}
}
ArticleDetailCell是从xib文件加载的,并且属性设置正确,因为我可以在调试器中看到这一点。当我从return cell
打印自定义单元格对象时停止在(gdb)
;
<ArticleDetailCell: 0x4bc22b0; baseClass = UITableViewCell; frame = (0 0; 320 367); autoresize = W+TM+BM; layer = <CALayer: 0x4bc23c0>>
细胞解除引用有问题吗?我仍然会考虑保留计数以及它们何时增加和不增加。
为什么整个UITableView因单个单元格出现问题而消失?
编辑: FYI @BoltClock
- (void)disableTableCell:(UITableViewCell **)cell {
[*cell setAccessoryType:UITableViewCellAccessoryNone];
[*cell setSelectionStyle:UITableViewCellSelectionStyleNone];
[[*cell textLabel] setTextColor:[UIColor lightGrayColor]];
}
答案 0 :(得分:1)
reuseIdentifier 在哪里定义?它始终可用于此方法吗?
答案 1 :(得分:1)
问题主要在于自定义单元格的xib文件。严格遵循Apple开发人员中心的Loading Custom Cells from NIB Files就可以了。
关键是要将自定义单元格中的File's Owner
设置为我使用单元格的UITableViewController
类型。 UITableViewController
还为自定义IBOutlet
提供了UITableViewCell
属性,该属性用于将File's Owner
连接到xib文件中的自定义单元格。
重要的是,在表视图单元格的xib文件中设置了Identifer,以便它与dequeueReusableCellWithIdentifier
方法中使用的值匹配。
cellForRowAtIndexPath
就像这样articleDetail
是IBOutlet
属性;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
if(indexPath.row == 0) {
ArticleDetailCell *cell = (ArticleDetailCell *)[tableView dequeueReusableCellWithIdentifier:[NSString stringWithFormat:@"%@Detail",reuseIdentifier]];
if(!cell) {
[[NSBundle mainBundle] loadNibNamed:@"ArticleDetailCell" owner:self options:nil];
cell = articleDetail;
[self setArticleDetail:nil];
}
[[cell judges] setText:[[self caseBaseArticle] judges]];
[[cell judgementDate] setText:[[self caseBaseArticle] judgmentDate]];
[[cell court] setText:[[self caseBaseArticle] court]];
return cell;
} else {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
if(!cell) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier] autorelease];
[[cell textLabel] setNumberOfLines:1];
[[cell textLabel] setFont:[UIFont systemFontOfSize:14]];
[[cell textLabel] setText:articleRowTitles[indexPath.row-1]];
}
if ([self tableRowHasContentDetail:indexPath]) {
[self enableTableCell:&cell];
}else {
[self disableTableCell:&cell];
}
return cell;
}
}