text becomeFirstResponder抛出EXC_BAD_ACCESS代码= 1地址= 0x1

时间:2014-02-20 11:14:16

标签: ios objective-c exc-bad-access becomefirstresponder

这是一个Q& A,希望能帮助遇到此问题的其他人。当我正在努力在控件之间传输FirstResponder链时,问题似乎随机发生。

控件是从UIView继承的自定义控件对象,其中UITextFieldUITextView作为子视图(与其他控件一起)添加,并完全在代码中生成。

并非所生成的控件的每个实例都抛出了异常,但是那些确实如此一致的是textfield/textview在代码中调用了[text becomeFirstResponder],还是textfield/textview被挖掘了上。

我在这个头发上撕了大约6个小时......

3 个答案:

答案 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];
        });