如何从其他视图控制器跳转至嵌入导航控制器的TableView并解决cell复用报错
问题原因
你当前通过AncientHeritageTableViewController()直接纯代码初始化表格控制器实例,但是该控制器的UITableView在调用dequeueReusableCell(withIdentifier: "datacell")方法获取cell时,找不到对应datacell标识的cell注册信息,就会触发这个报错。
解决方案
根据你项目的开发方式选择对应处理方案即可:
方案1:你的AncientHeritageTableViewController是在Storyboard中定义的(包括原型cell已经在Storyboard里设置了datacell复用标识)
你不能直接通过类名初始化控制器,需要从Storyboard中加载实例:
- 打开对应的Storyboard,选中
AncientHeritageTableViewController,在身份检查器面板给它设置Storyboard ID,例如设为AncientHeritageTableVC - 把跳转方法的代码替换为以下内容:
@objc private func goToHeritageSelection() { // 替换Main为你的Storyboard文件名(不需要带.storyboard后缀) let storyboard = UIStoryboard(name: "Main", bundle: nil) guard let vc = storyboard.instantiateViewController(withIdentifier: "AncientHeritageTableVC") as? AncientHeritageTableViewController else { return } // 如果需要跳转后保留导航栏,就把控制器包在UINavigationController里 let nav = UINavigationController(rootViewController: vc) nav.modalPresentationStyle = .fullScreen present(nav, animated: true, completion: nil) }
方案2:你的AncientHeritageTableViewController是纯代码开发,没有用到Storyboard
你需要在AncientHeritageTableViewController的viewDidLoad方法中手动注册cell:
- 如果用系统默认UITableViewCell:
// 写在AncientHeritageTableViewController的viewDidLoad中 tableView.register(UITableViewCell.self, forCellReuseIdentifier: "datacell")
- 如果用自定义的cell类(例如类名为
DataCell):
tableView.register(DataCell.self, forCellReuseIdentifier: "datacell")
- 如果用Xib自定义cell:
tableView.register(UINib(nibName: "DataCell", bundle: nil), forCellReuseIdentifier: "datacell")
内容的提问来源于stack exchange,提问作者Benny
相关产品推荐
相关产品推荐

