这是一个Q& A,希望能帮助遇到此问题的其他人。当我正在努力在控件之间传输FirstResponder链时,问题似乎随机发生。
控件是从UIView
继承的自定义控件对象,其中UITextField
或UITextView
作为子视图(与其他控件一起)添加,并完全在代码中生成。
并非所生成的控件的每个实例都抛出了异常,但是那些确实如此一致的是textfield/textview
在代码中调用了[text becomeFirstResponder]
,还是textfield/textview
被挖掘了上。
我在这个头发上撕了大约6个小时......
答案 0 :(得分:1)
基本自定义控件有一个布尔值'firstResponder',我用它来跟踪屏幕上的哪些自定义控件应该先开始编辑。
初始化代码如下:
if([firstResponderAttribute isEqualToString:@"YES"]) firstResponder=YES;
else firstResponder=NO;
当firstResponderAttribute为YES时,控件抛出错误,当NO为NO时控件没问题。显然,当将'firstResponder'设置为NO(== 0x0)时,响应者链将该值视为nil,但是当它被设置为YES(来自错误消息的== 0x1)时,响应者链试图访问地址中的对象0x1并失败。
解决方案?不要在任何UIView子类中使用firstResponder作为值!
另一方面,Analyze没有提到这个问题,我没有找到任何Apple文档中的值的引用(尽管我看起来并不是很难......)
答案 1 :(得分:1)
当UITextField delegate
为零时,我遇到了这个崩溃。例如,确保委托未设置为"文件所有者"在NIB文件中,该字段为nil。
答案 2 :(得分:0)
有时候,当你在底部观看视图或者不在屏幕/超级视图上观看时,你会得到
EXC_BAD_ACCESS
/* when you try*/
[responder becomeFirstResponder]
/*or*/
[super becomeFirstResponder];
稍后尝试一下。例如(在屏幕上查看/ view_with_responder时执行此操作:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[_toTokenField becomeFirstResponder];
});