You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:07:41