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

这是一个问答,希望能帮助遇到这个问题的其他人。 这个问题似乎随机发生,而我正在传输控件之间的FirstResponder链。

这些控件是从UIViewinheritance的自定义控件对象, UITextFieldUITextView作为子视图添加(使用其他控件),并完全在代码中生成。

不是生成的控件的每个实例都抛出exception,但是不pipe是textfield/textview在代码中调用了[text becomeFirstResponder] ,还是使用了textfield/textview

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

基本的自定义控件有一个布尔值“firstResponder”,我用它来跟踪屏幕上的哪个自定义控件应该首先开始编辑。

在初始化代码如下:

if([firstResponderAttribute isEqualToString:@"YES"]) firstResponder=YES; else firstResponder=NO;

当firstResponderAttribute为YES时,控件抛出错误,当它为NO时,控件没有问题。 很显然,当将'firstResponder'设置为NO(== 0x0)时,响应者链看到的值为nil,但是当它设置为YES(错误消息中的== 0x1)时,响应者链试图访问地址处的对象0x1和失败。

解? 不要在任何UIView子类中使用firstResponder作为值!

在一个侧面说明这个问题没有拿起分析,我还没有find任何参考苹果文档的价值(虽然我没有看起来很难…)

当UITextField delegate为零时,我得到了这个崩溃。 确保例如代理没有被设置为NIB文件中的“文件所有者”,其中该字段为零。

有时,当查看底部或查看不在屏幕上/超视图现在你得到

 EXC_BAD_ACCESS /* when you try*/ [responder becomeFirstResponder] /*or*/ [super becomeFirstResponder]; 

只是稍后尝试。 例如(当view / view_with_responder在屏幕上:

 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [_toTokenField becomeFirstResponder]; });