我正在使用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 in section返回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”日志行。
答案 0 :(得分:2)
我建议在viewWillAppear中放置[self.tableView reloadData]:因为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];
}
答案 1 :(得分:0)
尽管有许多建议和尝试,我绝对无法使用故事板使其工作。当然,我在某处遗漏了一些棘手的细节,但工具并没有提供任何有用的帮助。所以我回到了NIB,所以这是我目前的答案。
我想总结一下我在定义和使用单元格笔尖时不要错过的一些事项:
注册笔尖:
UINib* cellNib = [UINib nibWithNibName:@"ObjListCell" bundle:nil];
[self.tableView registerNib:cellNib forCellReuseIdentifier:@"objListCell"];
将单元格排队:
static NSString *cellIdentifier = @"objListCell";
ObjListCell* cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];
所有其余的都和往常一样。