Iphone 辞职FirstResponder导致EXC\u访问错误

Iphone 辞职FirstResponder导致EXC\u访问错误,iphone,cocoa-touch,uitextfield,first-responder,Iphone,Cocoa Touch,Uitextfield,First Responder,我在UITableViewCell上有一个UITextField,在另一个单元格上有一个按钮 我单击UITextField(显示键盘) UITextField具有以下名为的方法: - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField { NSLog(@"yes, it's being called"); owner.activeTextField = textField; return YES; }; 其中

我在UITableViewCell上有一个UITextField,在另一个单元格上有一个按钮

我单击UITextField(显示键盘)

UITextField具有以下名为的方法:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
        NSLog(@"yes, it's being called");
 owner.activeTextField = textField;
 return YES;
};
其中owner.activeTextField是(保留,非原子)属性

问题 当键盘可见时,我将单元格从视图中滚动出来。 然后单击另一个单元格上的按钮。按钮将调用:

[owner.activeTextField resignFirstResponder]
这会导致EXC\u访问不良

有什么想法吗?细胞肯定在记忆中。我的猜测是,一旦它消失,它就会从视图中删除,并且它的一个属性(父视图?)变为零,从而导致上述错误

我说得对吗


TL;博士当UITextField从视图中删除时,如何删除键盘(辞职第一响应者)?

有时问题可能是另一个层次的。。。检查并确保响应器链中的下一个对象(随后接收becomeFirstResponder消息的对象)不是垃圾。只是想一想。

您是否检查了
owner.activeTextField
以查看它是否已被解除分配/设置为零?不确定这是否会调用
EXC\u BAD\u访问
,但值得一试


您是否有任何呼叫
NSNotificationCenter
?我今天也遇到了类似的问题,导致
becomeFirstResponder
上出现
EXC_BAD_ACCESS
,这是因为我调用
[[NSNotificationCenter defaultCenter]removeObserver:keyboardObserver]在不正确的委托上

有点老了,但由于我刚刚在一个遗留的手动引用计数应用程序上遇到了同样的问题,我将尝试一下。注意:这个问题不应该再发生在ARC上了(如果发生了,我的解决方案肯定不适合那里…)

似乎发生的是:

  • 文本字段保存到单元格中,并且(可能超过)保留
  • 当您滚动带有文本字段的单元格时,单元格会被回收(这很好),但文本字段不会(这就是为什么当错误发生时文本字段仍在内存中的原因)
  • 在这一点上,关闭键盘会正确地让textfield的第一响应程序退出,但当调用沿着视图层次结构向下移动时,它会命中不再在内存中的单元格
解决这个问题的一个简单(而且在我看来很优雅)的办法是

  • 修复uitextfield的过度保留(如果有)
  • 子类UITextField在释放前退出第一响应者状态
  • 一种方法,如下所示:

    - (void) dealloc {
      [self resignFirstResponder];
      [super dealloc];
    }
    
    将是必需的,这将有一个副作用的好处,即删除键盘,一旦细胞离开视线

    另一个解决方案(出于各种原因,我选择了这个解决方案)是手动保留并使用textfield回收单元格,直到释放表为止


    我相信你已经解决了你的问题,但我希望这能帮助其他人…

    好主意。。我检查了textField的nextResponder属性(以及接下来的3个nextResponder),但它们看起来很好(重定向到现有对象),所以我猜不是这样。我通过在用户开始拖动UITableView时发送resignFirstResponder解决了这个问题。有人在答案中提出了类似的建议,然后删除了答案,因此我无法接受:(无论如何,我仍然不知道错误的原因,但解决方法很好。哇,这是一个很奇怪的问题,但它完全解决了我的问题,谢谢!我很高兴它帮助了我投票,然后:)我已经做了……你只能做一次。