Как активировать следующий UITextField в UITableView?

Я использую этот другой ответ SO для добавления UITextField к моим UITableViewCell s. Однако я сейчас не понимаю, как я могу позволить пользователю сосредоточиться на следующем элементе, используя следующую кнопку. Любые подсказки?

Ответы

Ответ 1

Попробуйте назначить tag для каждого UITextField. После нажатия кнопки "Далее" вычислите следующий тег и используйте [[UIView viewWithTag:nextTag] becomeFirstResponder], чтобы изменить фокус на следующее текстовое поле.

Ответ 2

Это сработало хорошо для меня, нужно было бы подгонять, чтобы соответствовать вашим потребностям:

#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;
}

Ответ 3

В дополнение к тому, что Anh опубликовал об использовании значения тега, чтобы найти следующее поле и сделать его firstResponder...

Если вы находитесь в UITableView, вам также нужно иметь в виду, что следующий UITextField может не отображаться на экране или даже в представлении, потому что он может быть ниже нижней части экрана. Возможно, вам придется прокрутить эту новую строку в представлении перед тем, как сделать ее первым ответчиком. То, что я сделал в предыдущем приложении, чтобы обработать это, заключалось в том, чтобы тег был значением, которое я мог бы использовать для обозначения NSIndexPath строки, чтобы я мог выяснить, в какую строку он находился. Затем вы можете прокрутить эту строку в виде с помощью:

[tableView scrollToRowAtIndexPath:newIndexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];

Тем не менее, это создает условие гонки, когда ячейка еще не видна, когда вы вызываете startFirstResponder, поэтому я бы задерживал startFirstResponder, пока он не станет видимым. Я бы установил значение как свойство в моем классе, например номер строки, поля, которое должно было стать первым ответчиком, а затем либо в cellForRowAtIndexPath, либо в willDisplayCell: forRowAtIndexPath, когда я собираюсь отобразить эту ячейку, которую я бы назвал бы startFirstResponder на текстовое поле THEN... потому что тогда оно будет гарантировано.

Ответ 4

Вам понравилось бы.

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];
        }
    }