UIStoryboard 中的自定义原型单元已创建,但未显示在 UITableView

Posted

技术标签:

【中文标题】UIStoryboard 中的自定义原型单元已创建,但未显示在 UITableView【英文标题】:Custom prototype cell in UIStoryboard is created but doesn't show up in UITableView 【发布时间】:2015-01-22 08:48:59 【问题描述】:

我有一个项目需要使用自定义 UITableViewCell。我正在将单元设计为故事板中的原型,在那里看起来很好。我将原型分配给我的自定义 UITableViewCell 子类,为其提供与我在 UITableView 中使用的相同的重用标识符,并将原型单元格上的 UILabel 链接到我的 UITableViewCell 子类中的 IBOutlet。

当我从 UITableView 调用它时,单元格被创建,如果我在该类的代码中添加标签和按钮(使用 CGRect 和所有创建它们)它们都可以工作,但我在情节提要中添加的标签永远不会出现。

我不明白如何成功调用和创建我的子类,但就我的应用而言,它的布局和情节提要中的子视图似乎不存在。我做错了什么?

这是我的 cellForRowAtIndexPath 代码

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];

    // Configure the cell...

    return cell;

【问题讨论】:

你能把你的 cellForRowAtIndexPath 代码伴侣吗? 你最好推荐appcoda.com/customize-table-view-cells-for-uitableview。这可能会对您有所帮助。 @iosNoob 我用代码编辑了这个问题。另外,当我在发布之前寻求帮助时,我找到了该链接并点击了它,但我仍然遇到这个问题,不知道为什么。 你使用的是xib还是storyboard? @iOSNoob Storyboard 和 UITableViewCell 子类。我创建了一个新项目只是为了测试这一点,这就是代码如此之少的原因。我创建了情节提要,正确设置(据我所知)并且正在使用我的子类,但是当我运行它时,我放在情节提要上的任何东西都没有出现在模拟器中。 【参考方案1】:

我之前遇到过这个问题,在我的例子中,问题在于视图控制器的自动生成代码包含对以下内容的调用:

[UITableView registerClass:forCellReuseIdentifier:]

我建议检查并删除对上述内容的任何调用,或对

[UITableView registerNib:forCellReuseIdentifier:]

并再次尝试您的原始代码。

【讨论】:

我不知道你是怎么想出来的,但这正是我需要的。非常感谢!【参考方案2】:

acreichman,在 cellForRow 中添加强制转换并在你的单元格的 awakeFromNib 中放置一个 NSLog,看看你是否到达那里。让我知道...

【讨论】:

我添加了演员表并将 NSLog 放入 awakeFromNib 中,但都没有解决我的问题,并且 NSLog 从未出现在日志中。但我也没有使用笔尖,我在情节提要中完成了这一切。我在我的 UITableViewCell 子类 initWithStyle 中放置了一个 NSLog,它确实显示在日志中,所以我知道它正在调用正确的类,即使我将原型单元类设置为我的自定义类,它也没有从情节提要中提取任何内容 @acreichman initWithStyle 不会被调用,因为您在情节提要中设置它,awakeFromNib 会。您应该仔细检查 ReuseIdentifier 和类是否设置正确(并且选择了单元格,而不是 contentView),并且在 cellForRow 中您正在处理正确的标识符......只要确保它应该工作。跨度> 【参考方案3】:

您的cellForIndexViewPath 应如下所示,以创建带有标签的简单custom cell

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    static NSString *simpleTableIdentifier = @"SimpleTableCell";

    SimpleTableCell *cell = (SimpleTableCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
    if (cell == nil) 
    
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"SimpleTableCell" owner:self options:nil];
        cell = [nib objectAtIndex:0];
     
    cell.nameLabel.text = [tableData objectAtIndex:indexPath.row];
    return cell;

确保你已经做好所有连接,将datasourcedelegate设置为table,然后在“属性检查器”中将custom cell的“标识符”设置为“MyTableViewCell”,如下所示,

故事板:

如上图所示,添加“MyTableViewCell”而不是“SimpleTableCell”。

【讨论】:

你可以为故事板而不是笔尖修改这个吗?在我的故事板中,单元格上有一个标签,但它没有显示我在故事板中设置的文本或我在 cellForRowAtIndexPath 中设置的任何自定义文本。该标签永远不会出现在模拟器中。 在 MyTableViewCell 类中与标签建立连接,然后将其访问到 cellForIndexViewPath。由于上面代码中的 nameLabel 是我在 SimpleTableCell 类中的标签。 两者都做了,并确保我的标识符和连接都是正确的,但仍然没有。我不知道为什么这不起作用。 @acreichman:检查 MyTableViewCell 视图中的类。单击 MyTableViewCell 视图,然后将此自定义类设置为 MyTableViewCell。 我从一开始就设置了这个设置,以及从我的原型上的标签到我的子类中的 UILabel 的连接,并且原型上的重用标识符与我的相同在 cellForRowAtIndexPath 中使用。一定有一些明显的东西我错过了,但我不知道它是什么。

以上是关于UIStoryboard 中的自定义原型单元已创建,但未显示在 UITableView的主要内容,如果未能解决你的问题,请参考以下文章

使用带有原型单元的自定义 UITableViewCell

使用从 Storyboard 定义的自定义 UITableViewController 和原型单元进行随机 UI 更新

更改单元格中的数据后,UITableView 中的自定义单元格将无法正确重新加载

无法将内容添加到 IB 视图控制器中的自定义表格视图单元格

UITableView 原型单元上的自定义附件视图未触发

如何在 Storyboard 控制器中重用定义为原型单元的自定义 UITableViewCell