已禁用的UIButton仍响应触摸并抛出[UITextView edit]未识别选择器错误
嘿,我太懂这种“明明按钮看着是禁用的,点了却炸锅”的困惑了!咱们从报错信息入手,一步步揪出问题所在:
核心问题分析
报错[UITextView edit]: unrecognized selector sent to instance说明某个edit方法的调用被发送给了UITextView实例,但UITextView根本没有这个方法。而你说这个方法是submitButton的IBAction,那大概率是连线或者target-action绑定出了差错。
具体排查步骤
检查Storyboard/XIB的连线
右键点击你的submitButton,打开Connections Inspector面板:- 确认
Touch Up Inside事件只关联到了你写的edit:方法,没有多余的连线; - 再去检查那个出问题的UITextView,看看它的Connections里有没有意外绑定了
edit:这个IBAction——很多时候拖拽连线时手滑就会出现这种误绑定。
- 确认
验证按钮禁用状态是否真的生效
在你设置submitButton.isEnabled = NO的代码前后加日志,确认状态确实被修改了:NSLog(@"按钮禁用前状态:%@", submitButton.isEnabled ? @"启用" : @"禁用"); submitButton.isEnabled = NO; NSLog(@"按钮禁用后状态:%@", submitButton.isEnabled ? @"启用" : @"禁用");如果日志显示状态没变化,那说明有其他代码在偷偷把按钮重新启用(比如视图生命周期方法、文本编辑回调里的逻辑)。
检查视图层级与触摸穿透
打开Debug View Hierarchy(Xcode调试栏里的那个方块按钮),看看submitButton是不是在UITextView的上层:- 如果按钮在TextView下面,触摸事件会先被TextView接收,就算按钮禁用也可能触发TextView的意外响应;
- 另外检查TextView的
userInteractionEnabled属性,如果它是开启的,且按钮层级不对,就容易出现这种穿透问题。
代码创建控件的情况排查
如果你是用纯代码创建按钮和TextView,检查有没有写错target-action的绑定:
比如是不是不小心写成了:// 错误:把按钮的事件绑定到了TextView [textView addTarget:self action:@selector(edit:) forControlEvents:UIControlEventTouchUpInside];正确的应该是绑定到submitButton:
[submitButton addTarget:self action:@selector(edit:) forControlEvents:UIControlEventTouchUpInside];
总结
从报错信息来看,最可能的原因就是edit:这个IBAction被误绑定到了UITextView上,优先排查连线问题,应该能很快解决这个恼人的bug!
内容的提问来源于stack exchange,提问作者Aecasorg

