Подтвердить что ты не робот

Лучший способ использовать кнопку "Далее" кнопки "Возврат" на UITextField для перехода к следующему UITextField

Я использую значение "Next" для "Return Key", чтобы получить кнопку "Далее" вместо кнопки "Готово", но (очевидно) нажатие на нее не автоматически переходит к следующему UITextField в моем представлении.

Какой правильный способ сделать это? На более широкой теме, каковы некоторые советы по правильному созданию форм в iPhone SDK?

4b9b3361

Ответ 1

Сделать некоторый объект первым делегатом текстового поля и реализовать метод - (BOOL)textFieldShouldReturn:(UITextField *)textField; в этом случае вызовите второе текстовое поле -becomeFirstResponder. Возвращая YES, это заставит текстовое поле выполнять поведение по умолчанию для кнопки возврата - я думаю, что обычно посылает свое сообщение о действии. Если у вас нет ничего добавленного в качестве цели этого действия, на самом деле не важно, что вы вернете.

Ответ 2

Чтобы основываться на ответе Ноя, если у вас много текстовых полей и вы не хотите иметь кучу if, вы можете сделать это следующим образом:

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    //[[self.view viewWithTag:textField.tag+1] becomeFirstResponder];

    UIView *view = [self.view viewWithTag:textField.tag + 1];     
    if (!view)         
          [textField resignFirstResponder];     
    else         
          [view becomeFirstResponder];
    return YES;
}

Как только вы помечаете каждое текстовое поле, начинающееся с любого числа, пока они помечены последовательно, в раскадровке или в коде, это должно работать.

Ответ 3

Для Swift:

func textFieldShouldReturn(textField: UITextField) -> Bool {
//your collection of textfields
    guard let i = textFields.indexOf(textField) else { return false }
    if i + 1 < textFields.count {
        textFields[i + 1].becomeFirstResponder()
        return true
    }
    textField.resignFirstResponder()
    return true
}

Ответ 4

Это, кажется, работает достаточно хорошо и не требует системы тегов, о которой многие говорят. В этом решении есть две вещи:

  • Все UITextFields должны быть в одном UIView (иметь тот же супервизор).
  • UITextFields должны быть в правильном порядке в построителе интерфейсов.

    -(BOOL)textFieldShouldReturn:(UITextField *)textField    {
       /*
       *  1. Loop through the textfield superview
       *  2. Get the next textfield in the superview  
       *  3. Focus that textfield
       */
    
       UIView *superView = [textField superview];
       BOOL foundCurrent = false;
       for (UITextField *tf in superView.subviews) {
          // Set focus on the next textfield
          if (foundCurrent) {
             [tf becomeFirstResponder];
             return NO;
          }
    
         //Find current textfield
         if ([tf isEqual:textField]) {
             foundCurrent = true;
          }
       }
    
       return YES;
    }    
    

Ответ 5

Мне не нравится иметь дело с тегом, поэтому вот мое решение. Создайте IBOutletCollection всех ваших текстовых полей в ViewController, перетащите, чтобы соединить текстовые поля по порядку сверху вниз.

@interface ViewController () <UITextFieldDelegate>
@property (strong, nonatomic) IBOutletCollection(UITextField) NSArray *allTextFields;
@end

В viewDidLoad установите делегат textFields. (Или установите его в раскадровку).

for (VVTextField *tf in self.allTextFields) {
    tf.delegate = self;
}

Затем реализуем UITextField Delegate

#pragma mark - UITextField Delegate

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    NSUInteger currentIndex = [self.allTextFields indexOfObject:textField];
    NSUInteger nextIndex = currentIndex+1;
    if (nextIndex < self.allTextFields.count) {
        [[self.allTextFields objectAtIndex:nextIndex] becomeFirstResponder];
    } else {
        [[self.allTextFields objectAtIndex:currentIndex] resignFirstResponder];
    }
    return YES;
}

Ответ 6

Я тоже борюсь с этой проблемой... и в результате я создал небольшую библиотеку для обработки нескольких текстовых полей. Вы можете найти его на github GNKeyboardAwareScrollView#GNTextFieldsManager.

Вы можете инициализировать его массивом текстовых полей:

NSArray *myTextFields = @[...]; // the order of array matters!
GNTextFieldsManager *manager = [[GNTextFieldsManager alloc] initWithTextFields:myTextFields];

Или путем указания родительского представления (и установки тегов для всех представлений):

GNTextFieldsManager *manager = [[GNTextFieldsManager alloc] initWithView:self.view];

Надеюсь, что я буду полезен для кого-то:)