UITableViewCell不显示内容

时间:2014-02-16 11:34:58

标签: ios uitableview

我正在使用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”日志行。

2 个答案:

答案 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,所以这是我目前的答案。

我想总结一下我在定义和使用单元格笔尖时不要错过的一些事项:

  • 在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];

所有其余的都和往常一样。