在以编程方式实例化的表视图控制器中注册一个单元

时间:2016-08-29 20:12:13

标签: ios swift uitableview nib

我收到此错误:

'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标签的问题?

2 个答案:

答案 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")
    }

}