点击搜索栏APP崩溃,报NSInternalInconsistencyException错误求助
解决UITableView无法出列ContactCell导致的崩溃问题
嘿,这个问题我太熟了!你遇到的是iOS开发里UITableView单元格注册的经典坑,报错信息已经把原因说得明明白白——你的ContactCell没有被正确注册到需要它的UITableView上,尤其是你用到了搜索控制器,很可能是主列表的tableView或者搜索结果的tableView其中一个没处理到位。
下面分三种常见场景给你对应的解决方案:
场景1:用故事板(Storyboard)创建原型单元格
如果你是在故事板里拖了原型单元格来用,那要检查两个关键点:
- 打开故事板,找到对应的UITableView(包括搜索结果控制器里的tableView,如果你的搜索结果用了独立的控制器)
- 选中原型单元格,在右侧属性面板的Identifier输入框里,确保填写的是
ContactCell,和你代码里出列单元格时用的标识符完全一致(大小写敏感!) - 同时别忘了把这个原型单元格的自定义类设置为
ContactCell(如果你的cell是自定义类的话)
场景2:用XIB文件创建自定义ContactCell
如果你的ContactCell是单独的XIB文件,那需要在代码里手动注册到tableView上。在ContactViewController的viewDidLoad()方法里添加以下代码:
override func viewDidLoad() { super.viewDidLoad() // 注册主列表的tableView单元格 tableView.register(UINib(nibName: "ContactCell", bundle: nil), forCellReuseIdentifier: "ContactCell") // 重点:如果搜索结果用了独立的UITableViewController,也要给它的tableView注册 if let searchResultsVC = searchController.searchResultsController as? UITableViewController { searchResultsVC.tableView.register(UINib(nibName: "ContactCell", bundle: nil), forCellReuseIdentifier: "ContactCell") } }
场景3:纯代码创建ContactCell
如果你的cell完全是用代码写的(没有XIB和故事板原型),那注册方式改成注册cell类:
override func viewDidLoad() { super.viewDidLoad() // 注册主列表的tableView单元格 tableView.register(ContactCell.self, forCellReuseIdentifier: "ContactCell") // 同样要给搜索结果的tableView注册(如果有的话) if let searchResultsVC = searchController.searchResultsController as? UITableViewController { searchResultsVC.tableView.register(ContactCell.self, forCellReuseIdentifier: "ContactCell") } }
最后检查出列代码
确保你在tableView(_:cellForRowAt:)方法里用的标识符和注册的完全一致:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { // 这里的标识符必须和注册时的一模一样,不能写错! let cell = tableView.dequeueReusableCell(withIdentifier: "ContactCell", for: indexPath) as! ContactCell // 根据数据源配置cell内容 let contact = tableView == self.tableView ? dataSource[indexPath.row] : filteredResult[indexPath.row] cell.nameLabel.text = contact.name // ...其他配置 return cell }
大部分情况下,漏掉搜索结果控制器的tableView注册是导致点击搜索栏崩溃的主要原因,一定要记得同步处理!
内容的提问来源于stack exchange,提问作者RasiqKhan
相关产品推荐
相关产品推荐

