注册自定义 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 宽度问题