2009-06-14 2 views
27

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

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

+1

Чтобы отметить ответ как правильный, просто нажмите на значок пустой галочки рядом с ответом ... –

ответ

36

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

+1

.. . Если вы находитесь в последнем UITextField, вы должны вызвать resignFirstResponder, чтобы скрыть клавиатуру. –

+0

- это совершенно другой способ, чем объяснять здесь (http://stackoverflow.com/questions/467881/how-do-you-change-the-uicontrol-with-focus-on-iphone) или оба будут работать так же хорошо ? – HollerTrain

+0

Либо будет работать. Мой ответ использует систему делегирования, Брэд - материал целевого действия. –

34

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

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

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

+0

Отличное решение! Один (второстепенный) предлагаемый твик-тест для viewWithTag == nil: 'UIView * view = [self.view viewWithTag: textField.tag + 1]; если (! Вид) [текстField resignFirstResponder]; else [view theFirstResponder]; ' – CharlesA

1

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

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

    -(BOOL)textFieldShouldReturn:(UITextField *)textField { 
        /* 
        * 1. Loop through the textfield's 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; 
    }  
    
0

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

Вы можете инициализировать его с массивом TextFields:

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

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

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

Надежда я буду полезным для кого-то:)

1

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

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

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

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

Затем реализовать UITextField делегат

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

Это может работать, но объекты в вашем массиве' IBOutletCollection' не гарантированно будут в правильном порядке. – JAL

+0

@JAL Отличная точка. Вы должны рассмотреть возможность редактирования своего ответа или сопоставление значений каким-то образом. Это может привести к неожиданному поведению. –

2

Для 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 
} 
Смежные вопросы