Ответ 1
Попробуйте назначить tag
для каждого UITextField. После нажатия кнопки "Далее" вычислите следующий тег и используйте [[UIView viewWithTag:nextTag] becomeFirstResponder]
, чтобы изменить фокус на следующее текстовое поле.
Я использую этот другой ответ SO для добавления UITextField
к моим UITableViewCell
s. Однако я сейчас не понимаю, как я могу позволить пользователю сосредоточиться на следующем элементе, используя следующую кнопку. Любые подсказки?
Попробуйте назначить tag
для каждого UITextField. После нажатия кнопки "Далее" вычислите следующий тег и используйте [[UIView viewWithTag:nextTag] becomeFirstResponder]
, чтобы изменить фокус на следующее текстовое поле.
Это сработало хорошо для меня, нужно было бы подгонять, чтобы соответствовать вашим потребностям:
#pragma mark - UITextField Delegate
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
HRCFormCell * currentCell = (HRCFormCell *) textField.superview.superview;
NSIndexPath * currentIndexPath = [self.tableview indexPathForCell:currentCell];
if (currentIndexPath.row != [self.questionsArray count] - 1) {
NSIndexPath * nextIndexPath = [NSIndexPath indexPathForRow:currentIndexPath.row + 1 inSection:0];
HRCFormCell * nextCell = (HRCFormCell *) [self.tableview cellForRowAtIndexPath:nextIndexPath];
[self.tableview scrollToRowAtIndexPath:nextIndexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
[nextCell.textField becomeFirstResponder];
}
return YES;
}
В дополнение к тому, что Anh опубликовал об использовании значения тега, чтобы найти следующее поле и сделать его firstResponder...
Если вы находитесь в UITableView, вам также нужно иметь в виду, что следующий UITextField может не отображаться на экране или даже в представлении, потому что он может быть ниже нижней части экрана. Возможно, вам придется прокрутить эту новую строку в представлении перед тем, как сделать ее первым ответчиком. То, что я сделал в предыдущем приложении, чтобы обработать это, заключалось в том, чтобы тег был значением, которое я мог бы использовать для обозначения NSIndexPath строки, чтобы я мог выяснить, в какую строку он находился. Затем вы можете прокрутить эту строку в виде с помощью:
[tableView scrollToRowAtIndexPath:newIndexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
Тем не менее, это создает условие гонки, когда ячейка еще не видна, когда вы вызываете startFirstResponder, поэтому я бы задерживал startFirstResponder, пока он не станет видимым. Я бы установил значение как свойство в моем классе, например номер строки, поля, которое должно было стать первым ответчиком, а затем либо в cellForRowAtIndexPath, либо в willDisplayCell: forRowAtIndexPath, когда я собираюсь отобразить эту ячейку, которую я бы назвал бы startFirstResponder на текстовое поле THEN... потому что тогда оно будет гарантировано.
Вам понравилось бы.
NSArray *arrayCells = [self.aTableView visibleCells];
UITableViewCell * currentCell = (UITableViewCell *) textField.superview.superview;
NSIndexPath * currentIndexPath = [self.aTableView indexPathForCell:currentCell];
if ((currentIndexPath.row != [arrayCells count] - 1) && (currentIndexPath.row < [arrayCells count]-1)) {
NSIndexPath * nextIndexPath = [NSIndexPath indexPathForRow:currentIndexPath.row + 1 inSection:0];
UITableViewCell * nextCell = (UITableViewCell *) [self.aTableView cellForRowAtIndexPath:nextIndexPath];
[self.aTableView scrollToRowAtIndexPath:nextIndexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
for (id object in nextCell.contentView.subviews) {
if ([object isKindOfClass:[UITextField class]]) {
UITextField *tf = object;
[tf becomeFirstResponder];
}
}