iOS应用点击结果页Done按钮崩溃:unrecognized selector异常求助
搞定
unrecognized selector sent to instance 崩溃问题 嘿,这个报错我太熟了!本质就是你的 ResultsController 对象收到了一个它完全不知道怎么处理的 done 消息,所以直接崩溃了。咱们一步步排查修复:
核心原因&解决步骤
1. 先确认 ResultsController 里真的有 done 方法
打开你的 ResultsController.swift 文件,看看有没有实现这个方法,注意签名必须和按钮绑定的匹配:
- 如果是代码写的Action,得是带
@IBAction标记的,比如:@IBAction func done(_ sender: UIButton) { // 这里写返回第一个问题页面的逻辑 navigationController?.popToRootViewController(animated: true) } - 如果是用Storyboard/XIB拖线绑定的,别漏了
@IBAction,而且参数类型(比如是UIButton还是Any)要和拖线时选的一致,名字也不能错(大小写敏感哦,Done和done是两个不同的方法)。
2. 检查按钮的Target-Action绑定是否正确
打开你的Storyboard/XIB,找到那个「done」按钮:
- 右键点按钮,看「Touch Up Inside」对应的Target是不是
ResultsController的实例,Action是不是done。 - 有时候手抖会绑错对象,或者Action名字打错,比如写成
don,这就会导致找不到方法。
3. 确认ViewController的类设置没错
在Storyboard/XIB里选中你的Results页面的ViewController,检查右侧Identity Inspector里的Class是不是test.ResultsController,别不小心选成了其他类,比如原来的模板类或者别的控制器。
4. 极端情况:内存野指针(概率低但也要排查)
如果上面都没问题,那可能是ResultsController的实例已经被释放了,但按钮还拿着它的无效指针。这种情况可以检查下导航栈的管理,确保ResultsController在被点击时还存活。
顺便帮你搞定需求逻辑
等崩溃修复后,在done方法里加上返回第一个问题页面的代码就行。假设第一个问题页面是导航栈的根控制器,就这么写:
@IBAction func done(_ sender: UIButton) { // 回到导航栈第一个页面 navigationController?.popToRootViewController(animated: true) // 如果第一个问题不是根控制器,也可以用这个方法指定跳转 // if let firstQuestionVC = navigationController?.viewControllers.first(where: { $0 is FirstQuestionController }) { // navigationController?.popToViewController(firstQuestionVC, animated: true) // } }
内容的提问来源于stack exchange,提问作者sheishistoric
相关产品推荐
相关产品推荐

