Проблема заключается в прокрутке. При прокрутке до верхней части следующей строки предыдущая строка удаляется и повторно используется для последней видимой строки, что означает, что метод cellForRowAtIndexPath:
, вероятно, вернет значение null, поскольку ячейка в данный момент недоступна.
Быстрое и грязное исправление включало бы прокрутку до середины или немного смещение, поэтому ячейка все еще видна. Не так быстро и грязно потребовалось бы создать процедуру, которая прокручивает таблицу, чтобы убедиться, что ячейка видна, а затем, когда прокрутка прекращается, установите текстовое поле в качестве первого респондента.
( Edit ) Чтобы объяснить немного больше, этот последний подход. Допустим, вы добавили новую переменную NSIndexPath *indexPathEditing
. Метод делегата tableView:cellForRowAtIndexPath:
будет иметь:
if (indexPathEditing && indexPathEditing.row == indexPath.row && indexPathEditing.section == && indexPath.section)
{
// Retrieve the textfield with its tag.
[(UITextField*)[cell viewWithTag:<#Whatever#>] becomeFirstResponder];
indexPathEditing = nil;
}
Это означает, что если установлено значение indexPathEditing
, а текущая загружаемая строка видна, оно автоматически установит себя как firstResponder
.
Затем, например (в вашем nextPrevious:
методе), все, что вам нужно сделать, это:
indexPathEditing = [NSIndexPath indexPathForRow:0 inSection:sectionCount];
[registrationTbl scrollToRowAtIndexPath:indexPathEditing
atScrollPosition:UITableViewScrollPositionTop
animated:YES];
[registrationTbl reloadData];
Появится строка, будет вызван tableView:cellForRowAtIndexPath:
, и он автоматически будет установлен как firstResponder
.
Также обратите внимание, что вместо выполнения for с isKindOfClass
проще установить номер тега, а затем получить объект с помощью viewWithTag:
, я включил это в пример.