iOS应用启动含Table View的视图控制器时触发Unrecognized selector错误
Q: 启动内嵌Table View的视图控制器时触发「Unrecognized selector sent to instance」错误,移除所有IBOutlet后仍未解决?
问题描述
我在开发iOS应用时碰到个特别棘手的问题:启动一个内嵌了Table View的视图控制器时,突然弹出「Unrecognized selector sent to instance」的错误。
一开始我以为是IBOutlet或者IBAction连错了,毕竟这类问题大多和UI绑定有关,但我把所有IBOutlet都删掉之后,问题居然还存在!折腾了好半天才找到根因和解决办法,现在分享出来帮大家少踩坑。
解决方案
我排查下来发现,问题根本不在IBOutlet上,而是Table View的数据源/代理设置出了问题——哪怕你移除了IBOutlet,Storyboard/XIB里可能还残留着旧的代理/数据源绑定,或者代码里的设置和Storyboard的绑定冲突了。具体解决步骤如下:
- 打开对应的Storyboard或XIB文件,选中那个内嵌的Table View,切换到右侧面板的「Connections Inspector」(就是那个箭头图标)
- 仔细检查「dataSource」和「delegate」这两项的连接,如果看到有带感叹号的异常连接,或者连接到了错误的对象上,直接点旁边的「x」删掉
- 回到视图控制器的代码里,确保在
viewDidLoad()方法里正确设置Table View的数据源和代理,比如Swift代码:override func viewDidLoad() { super.viewDidLoad() // 手动绑定数据源和代理到当前控制器 tableView.dataSource = self tableView.delegate = self } - 别忘了确认你的视图控制器已经正确遵循了
UITableViewDataSource和UITableViewDelegate协议,比如类声明要写成这样:class MyTableContainerVC: UIViewController, UITableViewDataSource, UITableViewDelegate { // 控制器的其他代码... } - 最后一步很重要:用
Command+Shift+K清理项目缓存,然后重新编译运行,这个错误就应该消失了!
内容的提问来源于stack exchange,提问作者skaldesh
相关产品推荐
相关产品推荐

