Я ударил эту ошибку прошлой ночью и провел несколько часов этим утром, пытаясь понять это. Другие ответы в этой теме не помогли мне, но помогли мне найти обходной путь, который я считаю лучшим.
Кэмерон предложил сделать UITextField вне экрана firstResponder, а затем отказаться от него перед вызовом endUpdates в табличном представлении. Это не сработало для меня, но дало мне идею.
В контексте моего пользовательского представления заголовка я переопределяю текстовое поле (на самом деле, в моем случае, UISearchBar) перед вызовом resignFirstResponder. Затем я положил его обратно:
[self.window addSubview: sb];
[sb resignFirstResponder];
[self addSubview: sb];
несколько строк спустя, когда я вызываю [tableView endUpdates], он больше не падает.
Редактировать: Это стало немного сложнее. Проблема заключается в том, что если статус первого респондента аннулируется (например, пользователь отклоняет клавиатуру), этот код смены родителей не выполняется, и мы в конечном итоге получим сбой. Мое текущее исправление заключается в размещении переопределения категории в UITextField resignFirstResponder - кажется, работает, но пока не уверен, есть ли какие-либо побочные эффекты.
@implementation UITextField (private)
- (BOOL) resignFirstResponder
{
UIView* superviewSave = self.superview;
[self.window addSubview: self];
BOOL success = [super resignFirstResponder];
[superviewSave addSubview: self];
return success;
}
@end