为何Segue触发时抛出“unrecognized selector sent to instance”异常?
解析"unrecognized selector sent to instance"异常的原因及解决思路
这个错误说白了就是系统找不到你要调用的那个方法,结合你用按钮触发Segue的场景,大概率是下面这几个坑导致的:
1. IBAction方法的签名或连线出问题
你贴的代码里,方法是@IBAction func femaleButton(_ sender: AnyObject),首先,现在iOS开发里IBAction更常用UIButton或者Any作为sender类型,虽然AnyObject理论上兼容,但如果你的按钮在Storyboard里的连线和代码方法不匹配,就会触发错误。比如:
- 你可能在Storyboard里把按钮的
Touch Up Inside事件连到了一个已经被删除、重命名的方法,或者连线指向的方法签名和你现在代码里的不一样(比如之前参数是UIButton,后来改成了AnyObject但没重新连线); - 你贴的代码明显不完整——缺少闭合的
},如果实际代码就是这样,编译器可能没拦住,但运行时系统会识别不出完整的方法,直接报错。
2. Segue触发方式的冲突
触发Segue有两种常见方式:
- 直接在Storyboard里把按钮拖到第二个VC创建Segue(这种情况下,按钮点击会自动触发Segue,不需要额外写IBAction);
- 在IBAction里调用
performSegue(withIdentifier: "你的SegueID", sender: sender)手动触发。
如果你既做了Storyboard自动Segue,又写了IBAction,而且IBAction本身有问题(比如方法找不到),那按钮点击时系统先尝试调用IBAction,就会抛出这个异常。另外,如果是手动触发Segue,你还得确认Segue的标识符和代码里写的完全一致,不然也可能间接引发问题。
3. 视图控制器的类绑定错误
打开Storyboard,检查第一个ViewController的Custom Class是不是正确绑定了你代码里的那个VC类。如果类名写错或者没绑定,按钮的IBAction就找不到对应的方法实现,自然会报错。
快速排查步骤
- 检查连线有效性:右键点击Storyboard里的按钮,查看
Touch Up Inside对应的连线,如果有红色标记,直接删掉重新拖线到代码里的正确方法; - 补全代码:把IBAction方法的闭合
}补上,确保方法定义完整; - 统一方法签名:把IBAction的参数改成
@IBAction func femaleButton(_ sender: UIButton),这样更明确,也避免类型不兼容的问题; - 核对Segue配置:如果是手动触发Segue,确认Storyboard里Segue的
Identifier和代码里performSegue调用的标识符完全一致,没有拼写错误。
内容的提问来源于stack exchange,提问作者lordcrandon
相关产品推荐
相关产品推荐

