我收到此错误:
'NSInternalInconsistencyException', reason: 'unable to dequeue a cell with identifier NavigationNodeCell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard'
我使用两个具有相同类“NavigationItemCell”的单元格和两个标识符“NavigationNodeCell”和“NavigationLinkCell”。
我用例如:
创建了一个单元格let cell: NavigationItemCell = self.tableView.dequeueReusableCellWithIdentifier("NavigationNodeCell", forIndexPath: indexPath) as! NavigationItemCell
这个问题一直存在于我面前,例如Assertion failure in dequeueReusableCellWithIdentifier:forIndexPath:
据我了解(例如Sebastian Borggrewe的缩写),在故事板中注册UITableViewCell及其自定义类和标识符就足够了。
这正是我做的,我仍然得到这个错误。 我试图使用两个不同的类,但它没有解决错误。 我也尝试用笔尖注册我的细胞但是我遇到了其他问题(标签是零)。
我发现这个问题可能会发生,因为我以编程方式实例化了一个新的表视图控制器。
var newController = MyTableViewController()
这是否意味着我必须注册nib?这是一个问题,我必须两次注册同一个班级?我如何避免nil标签的问题?
答案 0 :(得分:5)
您应该使用storyboard ID创建视图控制器的实例。
用以下代码替换行var newController = MyTableViewController()
let storyboard = UIStoryboard(name: "YOUR_STORYBOARD_NAME", bundle: nil)
let newController = storyboard.instantiateViewController(withIdentifier: "VIEWCONTROLLER_ID_FROM_STORYBOARD")
修改强>
它也可以使用:
self.storyboard!.instantiateViewControllerWithIdentifier("VIEWCONTROLLER_ID_FROM_STORYBOARD")
如果视图控制器是从故事板实例化的,并且第二个视图控制器在同一个故事板中
答案 1 :(得分:1)
如果使用初始化程序(而不是storybaord.instantiateViewController(withIdentifier:)
)创建表视图控制器,那么表视图控制器将不会知道您放在故事板中的单元格。如果您想使用初始化程序,则需要在控制器viewDidLoad
中手动注册自定义单元格类。
class MyTableViewController: UITableViewController {
override func viewDidLoad() {
super.viewDidLoad
tableView.register(NavigationNodeCell.self, forCellReuseIdentifier: "NavigationNodeCell")
}
}