Как активировать следующий UITextField в UITableView? - PullRequest
14 голосов
/ 04 марта 2011

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

Ответы [ 4 ]

13 голосов
/ 04 марта 2011

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

12 голосов
/ 08 февраля 2012

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

#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;
}
10 голосов
/ 04 марта 2011

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

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

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

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

2 голосов
/ 19 октября 2012

Хотели бы вы ..

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