resignFirstResponder вызывает EXC_BAD_ACCESS - PullRequest
4 голосов
/ 31 августа 2010

У меня есть UITextField на UITableViewCell и кнопка в другой ячейке.

Я нажимаю на 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.

Есть идеи?Клетка наиболее определенно в памяти.Я предполагаю, что, как только он исчезает, он удаляется из представления, и одно из его свойств (родительское представление?) Становится нулевым, и это вызывает указанную ошибку ..

Я прав?

** TL тысяча двадцать один; DR;Как я могу удалить клавиатуру (подать в отставку первого респондента), когда UITextField удаляется из вида?

Ответы [ 3 ]

2 голосов
/ 31 августа 2010

Иногда проблема может быть на другом уровне ... Проверьте и убедитесь, что следующий объект в цепочке респондента (тот, который впоследствии получает сообщение становитсяFirstResponder) не мусор.Просто мысль.

0 голосов
/ 17 июня 2014

Немного стар, но так как у меня просто была та же проблема с устаревшим приложением ручного подсчета ссылок, я попробую.Примечание: эта проблема больше не должна возникать с ARC (и если это произойдет, мое решение определенно там не подходит ...).

Похоже, что происходит:

  • текстовое поле сохраняется в ячейке и сохраняется (возможно, более)
  • , когда вы прокручиваете ячейку с текстовым полем, ячейка получает переработанный (что хорошо), ноtextfield - нет (именно поэтому текстовое поле все еще находится в памяти, когда ошибка возникает)
  • в этот момент, при правильном отклонении клавиатуры отставка первого респондента для текстового поля, но по мере того, как вызов перемещается вниз по иерархии представления,он попадает в ячейку, которой больше нет в памяти.

простое (и, как мне кажется, элегантное) решение проблемы -

  1. исправить чрезмерное сохранение uitextfieldесли какой-либо
  2. подкласс UITextField для отставки статуса первого респондента перед освобождением

, потребуется единственный метод, такой как:

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

, который будет иметьTПобочным эффектом является удаление клавиатуры, как только ячейка выходит из поля зрения.

Другое решение (которое я выбрал по разным причинам) - вручную сохранить и перезапустить ячейку стекстовое поле, пока таблица не будет освобождена.

Я уверен, что вы уже решили свою проблему, но я надеюсь, что это поможет кому-то еще ...

0 голосов
/ 18 марта 2012

Вы проверили owner.activeTextField, чтобы увидеть, был ли он освобожден / установлен в ноль? Не уверен, что это вызовет EXC_BAD_ACCESS, но стоит попробовать.

Также есть ли у вас звонки на NSNotificationCenter? Сегодня я боролся с чем-то похожим, что вызвало EXC_BAD_ACCESS на becomeFirstResponder, из-за которого я вызвал [[NSNotificationCenter defaultCenter] removeObserver:keyboardObserver]; с неверным делегатом.

...