注册自定义 uitableviewcell 时出错

Posted

技术标签:

【中文标题】注册自定义 uitableviewcell 时出错【英文标题】:error when registering a custom uitableviewcell 【发布时间】:2014-05-26 20:59:10 【问题描述】:

“为标识符 (myGoal) 注册的 nib 无效 - nib 必须恰好包含一个***对象,该对象必须是 UITableViewCell 实例”

那是我不断得到的例外。我同时使用情节提要和 XIB。

在我的故事板中,我在导航视图中有一个表格视图。 tableview 设置为动态原型,原型单元格的数量为零。原因是我想以编程方式添加自定义单元格。

第一次以编程方式添加单元格时,我使用了一种通用单元格样式。它会工作的!

- (void)viewDidLoad

    [super viewDidLoad];
    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"myGoal"];


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"myGoal"
                                                        forIndexPath:indexPath];
    //do stuff with cell

它会让我有一个默认单元格样式的表格视图,它有一个标签。

接下来我想自定义我的单元格,以便它有多个标签和一些额外的按钮。通常,我会在故事板界面构建器中完成,但这次我需要以编程方式完成。

所以我创建了一个自定义的 tableviewcell 类以及它的 Xib 对应项。在 Xib 中,我按照自己的意愿设计了它。问题在于让这个单元格显示在表格视图中。

tableview 在 storyboard 中而 tableviewcell 在 xib 中是否重要?

为了注册自定义笔尖,我做了与上面几乎相同的事情,但它崩溃了:

- (void)viewDidLoad

    [super viewDidLoad];
    UINib *dhCustomNib = [UINib nibWithNibName:@"DHTableViewCell" bundle:nil];
    [self.tableView registerNib:dhCustomNib forCellReuseIdentifier:@"myGoal"];

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    DHTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"myGoal"
                                                        forIndexPath:indexPath]; //It crashes at this point
    //do stuff with cell

我错过了什么?

【问题讨论】:

您能展示一下您的笔尖是如何设置的吗?您需要确保有一个***对象,并且需要将其类设置为 UITableViewCell 的子类 你的 DHTableViewCell 类应该是 UITableViewCell 的子类,并且必须是 nib 中唯一的***对象 如果你有任何手势识别器设置了笔尖,他们会导致这个错误。 @Paul.s 文件所有者设置为 DHTableViewCell。如何设置它以便只有一个***对象? @Paul.s DHTableViewCell 已设置为 uitableviewcell 的子类。在 xib 的身份检查器中,自定义类已设置为 DHTableViewCell。我不确定我还缺少什么。 【参考方案1】:

您需要将***对象设置为DHTableViewCell 子类而不是文件的所有者。

【讨论】:

有趣。显然我有一个表格视图单元格,并且表格视图单元格后面有一个标签。我没有注意到它。在侧栏上,它显示表格视图单元格下方的一行,然后是标签的实例。删除标签后,异常停止发生。我想这意味着我有 2 个***对象,一个 tableview 和一个标签。但是,我不明白另一个标签的泥潭存在怎么会造成这么大的麻烦。另外,如果不允许,为什么还要允许呢? 一般来说,在 nib 中拥有多个***对象并不违法。这是 Apple 的课程,因此您必须遵守他们的规则 - 它可能是一种性能优化,因为您希望对象尽快加载,或者它可能只是一个任意要求 - 谁知道...

以上是关于注册自定义 uitableviewcell 时出错的主要内容,如果未能解决你的问题,请参考以下文章

自定义uitableviewcell时,registerNib与registerClass的区别(转载)

创建自定义表格视图分隔符时出错

为自定义 UITableViewCell 加载和注册 nib 时未调用 prepareForSegue

Swift 自定义 UITableviewCell 宽度问题

注册 UITableViewCell 以供重用时,该单元格上的哪个 init 方法被调用? [复制]

将参数传递给自定义 UITableViewCell [重复]