【问题标题】:Nib must contain exactly one top level object which must be a UITableViewCell instance. Works in other UITableViewsNib 必须包含一个必须是 UITableViewCell 实例的顶级对象。适用于其他 UITableViews
【发布时间】:2020-01-23 12:38:22
【问题描述】:

我有一个 UITableViewCell,我将它写在一个单独的 .xib 文件中,用于几个不同的 UITableView。 TableViews 都继承自一个注册 UINib 以供使用的类,标识符为“SpecialCell”。

对于除一个 TableView 之外的所有 TableView,单元格都会出列并且工作正常。但是,对于其中一个,我收到此错误:

*** -[app.MyTableView _dequeueReusableViewOfType:withIdentifier:] 中的断言失败,/BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKitCore/UIKit-3899.13.13/UITableView.m:8546

*** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“为标识符 (SpecialCell) 注册的 nib 无效 - nib 必须包含一个必须是 UITableViewCell 实例的顶级对象”

我正在使用与其他 TableView 中完全相同的代码将单元格出列,但我无法弄清楚为什么仅在其中一个 ViewController 中会发生此问题。

我已经看到一些与同一消息相关的答案,但似乎没有一个适用于此。没有任何无关的顶级对象(并且由于单元格在其他 ViewController 中加载得非常好,所以我认为这不是真正的根本问题)。

这是我正在使用的代码(在每个 ViewController 中都相同)使单元格出列。

guard let cell = tableView.dequeueReusableCell(withIdentifier: "SpecialCell", for: indexPath) as? SpecialCell else {
    print("can't load SpecialCell")
    return UITableViewCell()
}
return cell

(无论如何,else 子句中的 print 语句不会运行)。

如果有人对问题可能有任何线索,我将不胜感激!

编辑:Picture of the SpecialCell nib as requested

【问题讨论】:

  • 你能用你的xib的图像编辑吗?你也注册了你的cell吗?
  • 在此处添加了屏幕截图。是的,单元格已注册,并在其他表格视图中正确出列。
  • 为什么会有ticketView?我的意思是已经有了一个观点。尝试删除此视图。
  • 如果它适用于所有其他表视图,我怀疑您设置的新表视图与其他表视图不同。也许您没有使用继承您提到的所有逻辑的子类。如果不是这样,您真的需要发布更多代码(如何设置表格视图等)以及界面构建器中表格视图单元的屏幕截图
  • 此时我已经用一把细齿梳完成了它,并且在这个特定的 tableview 的结构方式上找不到任何区别。我倾向于重建它,看看它是否有效,以完全确定我没有遗漏什么时髦的东西。

标签: ios swift uitableview uikit


【解决方案1】:

在不同的类之间使用相同的重用标识符不是一个好习惯。每次在 TableView 中使用 TableView 单元格时,都会使用唯一标识符注册它。这使 iOS 更容易识别您的单元格。即使在文档中,他们也指定如果您重复使用相同的标识符,旧的注册将失效。

如果您之前注册了具有相同重用性的类或 nib 文件 标识符,您在 nib 参数中指定的 nib 替换旧的 入口。如果要取消注册 nib,可以为 nib 指定 nil 来自指定的重用标识符。

Docs

【讨论】:

  • 谢谢,我试试看。
【解决方案2】:

为什么会有ticketView?我的意思是已经有了一个观点。尝试删除这个ticketView。 同样在viewDidLoad 注册这样的: tableView.registerNib(UINib(nibName: "cellName", bundle: nil), forCellReuseIdentifier: "cellIdentifier")

【讨论】:

  • TicketView 是一个在其他地方重用的视图,而不仅仅是在这个单元格中,因此是这个结构。使用该方法进行注册也不起作用。同样,问题似乎不在于单元格本身,它适用于项目中的所有其他 tableview。
猜你喜欢
  • 2013-09-09
  • 2017-12-31
  • 2017-05-02
  • 2013-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-17
相关资源
最近更新 更多