Попытка сделать пользовательский UITableViewCell с UITextField статьFirstResponder при редактировании

У меня есть UITableViewController с пользовательскими UITableViewCell, которые содержат UITextField. При переключении представления таблицы в режим редактирования я добавляю новую ячейку в конец таблицы и хочу сделать эту ячейку becomeFirstResponder. Мой метод tableView:cellForRowAtIndexPath: проверяет эту нижнюю ячейку, поэтому я просто добавил строку:

[cell.theTextField становится первым ответчиком];

Который, как я считал, должен работать. Однако при первом отображении табличного представления оно, похоже, не работает. НО, если я выберу ячейку (сделав ее первым респондентом), затем выйду из режима редактирования (вызвав resignFirstResponder в моем коде), я смогу вернуться в режим редактирования, и волшебным образом она станет первым респондентом, как я и ожидал!

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

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

У кого-нибудь есть идеи относительно того, что здесь может происходить?


person DataJock    schedule 20.01.2012    source источник


Ответы (1)


Первый вызов becomeFirstResponder терпит неудачу, потому что ячейка еще не имеет суперпредставления. Представление таблицы добавляет ячейку в качестве своего подпредставления после того, как вы вернете ее из tableView:cellForRowAtIndexPath:. Я предлагаю вам сделать этот звонок в другом месте. Если у вас уже есть собственный подкласс UITableViewCell, вы можете реализовать didMoveToWindow: и вызвать там [self becomeFirstResponder].

person Costique    schedule 20.01.2012
comment
Спасибо за предложение, но есть пара моментов. 1) Как бы я выбрал это только для этой одной ячейки (а не для всех), 2) Я попытался просто добавить это в свой собственный класс ячеек, и это ничего не сделало. Я также попытался поместить это в tableView:willDisplayCell:forRowAtIndexPath:, где я могу сделать «если» только для этой ячейки, и это все равно не сработало. - person DataJock; 20.01.2012
comment
Хм, это тяжело. Как добавить ячейку при входе в режим редактирования? Если ничего не помогает, вы можете выполнить becomeFirstResponder после задержки, но это некрасиво, хрупко и должно быть сделано только в крайнем случае. - person Costique; 21.01.2012
comment
Вот соответствующая часть: [self.tableView beginUpdates]; если (редактирование) { [self.tableView insertRowsAtIndexPaths: [NSArray arrayWithObject: indexPathForNewLabel] withRowAnimation: UITableViewRowAnimationAutomatic]; } [self.tableView endUpdates]; - person DataJock; 21.01.2012