UITableViewCell 不显示内容
Posted
技术标签:
【中文标题】UITableViewCell 不显示内容【英文标题】:UITableViewCell doesn't show content 【发布时间】:2014-02-16 11:34:58 【问题描述】:我正在使用 Xcode 5,并正在开发针对 ios6/7 的应用程序。
在我的故事板中,引用自定义类“ObjListCell”的“原型单元格”,派生自“UITableViewCell”,包含一个“内容视图”,而该“内容视图”又包含一个 UIImageView 和两个 UILabel 元素。他们三个都连接到我的 ObjListCell 类中的一个 IBOutlet。
表格视图控制器是指我的自定义类“ObjListViewController”,派生自“UITableViewController”。创建此视图控制器时,我已经检索了数据,因此在 viewDidLoad 中我立即调用[self.tableView reloadData];
。但在此之前,我注册了单元格类:[self.tableView registerClass: [ObjListCell class] forCellReuseIdentifier:@"objTableCell"];
,并且在情节提要中将“objTableCell”设置为单元格的标识符。
部分中的方法 numberOfRows 返回 14,实际上我在我的 iPhone 上看到了一个包含 14 个空行的列表。正如我从日志中看到的,实际上调用了方法 cellForRowAtIndexPath,并且方法 dequeueReusableCellWithIdentifier 返回了一个非零单元格。于是我设置了图标和标签内容:
cell.mCellIcon.image = icon;
cell.mCellTitle.text = title;
cell.mCellExtra.text = extra;
我确定图标和文本都可以,因为我在分配它们之前就记录了它们。 但是,我的表格单元格显示为空。
谁能提出问题出在哪里?
这是 cellForRowAtIndexPath 的完整代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *cellIdentifier = @"objTableCell";
ObjListCell* cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];
if (cell == nil)
NSLog(@"ObjListViewController ERROR: Cell is nil");
// Retrieve obj for this cell
Obj* obj = [mObjs objectAtIndex:indexPath.row];
if (obj == nil)
NSLog(@"ObjListViewController ERROR: Obj not found for cell; indexPath = %i", indexPath.row);
NSLog(@"ObjListViewController DEBUG: title = %@, extra = %@", obj.mTitle, obj.mExtra);
// Set cell icon
UIImage *icon = [mIcons iconForId:obj.mId andSize:@"big" withDefault:@"defaultIcon"];
if (icon == nil)
NSLog(@"ObjListViewController ERROR: Icon not found for cell; indexPath = %i", indexPath.row);
cell.mCellIcon.image = icon;
// Set cell title and extra
cell.mCellTitle.text = obj.mTitle;
if (obj.hasExtra)
cell.mCellExtra.text = obj.mExtra;
NSLog(@"ObjListViewController DEBUG: Inspecting cell content; icon = %@, title = %@, extra = %@",
(cell.mCellIcon.image != nil ? @"OK" : @"nil"), cell.mCellTitle.text, cell.mCellExtra.text);
// Standard accessory symbol
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
return cell;
这是日志的摘录:
2014-02-16 15:21:06.665 trekking-etc-viewer[2671:60b] ObjListViewController DEBUG: title = Valle d'Aosta, extra =
2014-02-16 15:21:06.668 trekking-etc-viewer[2671:60b] ObjListViewController DEBUG: Inspecting cell content; icon = nil, title = (null), extra = (null)
2014-02-16 15:21:06.685 trekking-etc-viewer[2671:60b] ObjListViewController DEBUG: title = Provincia di Belluno, extra =
2014-02-16 15:21:06.690 trekking-etc-viewer[2671:60b] ObjListViewController DEBUG: Inspecting cell content; icon = nil, title = (null), extra = (null)
日志中没有出现任何“ERROR”日志行。
【问题讨论】:
您是否将单元格的类更改为您在 IB 中的自定义类? 是的,我做到了。在故事板中,我的意思是。我刚刚发现我没有在我的 ObjListCell.m 文件中合成三个 IBOutlets,但是在修复这个问题之后问题仍然存在。我还添加了一个日志来检查 cell.mCellIcon.image、cell.mCellTitle.text 和 cell.mCellExtra.text 的值,在为它们分配值之后:它们是零!但正如我所说,赋值前的右手数据是可以的。 添加NSLog(@"%@ %@ %@", cell.mCellIcon, cell.mCellTitle, cell.mCellExtra);
。如果它将显示 nil 值 - 您忘记将 GUI 元素绑定到 IBOtlet。
实际上它们是 nil,但在故事板中,三个 UI 元素确实有一个引用出口,例如 mCellIcon 引用 ObjListCell。当我检查 ObjListCell.h 文件中的 IBOutlets 时,每个左侧出现一个实心点;这意味着它们已正确连接,我猜。
【参考方案1】:
我建议将 [self.tableView reloadData] 放在 viewWillAppear: 中,因为 tableView 在 viewDidload: 中可能尚不可用。
另外,如果我遇到这样的问题,我会给我的对象设置边框,看看它们是否真的放置在我期望的位置:
label.layer.borderWidth = 1.0f;
label.layer.borderColor = [UIColor greenColor].CGColor;
如何在 cellForRowAtIndexPath 中尝试以下操作:
static NSString *CellIdentifier = @"objTableCell";
ObjListCell *cell = (ObjListCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (!cell)
cell = [[DDTripCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
【讨论】:
谢谢 Nick,我将 [self.tableView reloadData] 移至 viewWillAppear,但这并没有解决问题。我还按照建议添加了边框颜色,但没有出现。此外,在情节提要中,我为内容视图、图标和两个标签设置了标签。然后尝试通过 viewWithTag 找到各自的视图,但结果为零。看起来故事板中定义的原型单元根本不起作用......最后,如果我覆盖 ObjListCell 类中的 initWithStyle:reuseIdentifier 并将 NSLog 放入其中,我看到它被调用了。 能否粘贴您的 cellForRowAtIndexPath:,这可能有助于识别问题? 编辑了原始问题以添加这些详细信息。 mObjs 是一个数组,包含要在列表中显示的数据;它在创建表视图控制器时已经加载。 mIcons 是一个包含图标的容器。它最初提供默认图标;随后会加载实际的图标,但这是另一回事... @GiorgioBarchiesi 我已经更新了我的答案,建议在你的 cellForRowAtIndexPath: 方法中尝试。 如果这仍然导致问题,请随时通过“admin at myfirstiphoneapp dot co dot uk”将您的项目通过电子邮件发送给我,以便我仔细查看。【参考方案2】:尽管有很多建议和尝试,但我绝对无法使用故事板使其工作。当然,我在某处遗漏了一些棘手的细节,但工具在这件事上没有提供任何有用的帮助。所以我回到了NIB,所以这是我目前的答案。
我想总结一下我在定义和使用单元格的笔尖时注意不要错过的几件事:
在 NIB 中,将表视图控制器设置为文件的所有者 在 NIB 中,将单元格标识符设置为正确的值(对我来说是 objListCell) 在 NIB 中,将每个 UI 元素连接到单元格的 .h 文件中的 IBOutlet 在单元格的 .m 文件中,可能会合成出口,但如果不这样做,它的工作原理都是一样的 在表的 .m 文件的 viewWillAppear 中,注册 NIB(详见下文) 在表格的 .m 文件的 cellForRowAtIndexPath 中,将您的单元格出列(请参阅下面的详细信息)注册笔尖:
UINib* cellNib = [UINib nibWithNibName:@"ObjListCell" bundle:nil];
[self.tableView registerNib:cellNib forCellReuseIdentifier:@"objListCell"];
出列单元格:
static NSString *cellIdentifier = @"objListCell";
ObjListCell* cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];
其余的都和往常一样。
【讨论】:
以上是关于UITableViewCell 不显示内容的主要内容,如果未能解决你的问题,请参考以下文章