5

我在 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_BAD_ACCESS。

任何想法?细胞肯定在内存中。我的猜测是,一旦它消失,它就会从视图中删除,并且它的一个属性(父视图?)变为 nil 并导致上述错误..

我对吗?

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

4

3 回答 3

2

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

于 2010-08-31T16:06:20.413 回答
0

您是否检查owner.activeTextField过它是否已被释放/设置为零?不确定这是否会调用EXC_BAD_ACCESS但值得一试。

你也有电话NSNotificationCenter吗?我今天正在与类似的事情作斗争,这导致了EXC_BAD_ACCESSon becomeFirstResponder,这是由于我调用[[NSNotificationCenter defaultCenter] removeObserver:keyboardObserver];了不正确的代表。

于 2012-03-18T05:44:16.177 回答
0

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

似乎发生的是:

  • 文本字段保存到单元格中并(可能超过)保留
  • 当您使用文本字段滚动单元格时,单元格会被回收(这很好),但文本字段不是(这就是为什么当错误发生时文本字段仍在内存中的原因)
  • 那时,正确地关闭键盘会导致文本字段的第一响应者退出,但是随着调用沿着视图层次结构向下传播,它会到达不再存在于内存中的单元格。

这个问题的一个简单(和 imo 优雅)的解决方案是

  1. 修复 uitextfield 的过度保留(如果有)
  2. 子类 UITextField 在被释放之前退出第一响应者状态

一个方法,像这样:

- (void) dealloc {
  [self resignFirstResponder];
  [super dealloc];
}

将是必需的,这将具有在单元格消失后立即移除键盘的副作用。

另一种解决方案(这是我选择的一个,出于各种原因)是手动保留和回收带有文本字段的单元格,直到表被释放。

我确定你已经解决了你的问题,但我希望这对其他人有帮助......

于 2014-06-17T14:29:48.030 回答