2009-12-08 5 views
5

Я разрабатываю приложение, где я произвольно создаю UITextField, и я допускаю максимум 1 символ в UITextField.Как перемещать курсор на следующий UITextField программно?

Это прекрасно работает.

Но после написания символа, пользователь должен снова нажать на следующей UITextField представить клавиатуры

После ввода 1 символ курсор должен автоматически перейти к следующему UITextField.

Как я могу это сделать?

ответ

16

Поймать делегата, который информирует вас о том, что ваше текстовое поле было изменено. Проверьте, что новая длина равна 1. Если это так, вызовите becomeFirstResponder в следующем поле.

+0

как это делается? вы можете показать пример кода? – quantum

+0

'[textField статьFirstResponder]' – akashivskyy

4

Я нашел этот подход ..

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 

    NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string]; 

    if(textField == textField1) 
    { 
     if (textField1.text.length > 0 && range.length == 0) 
     { 
      return NO; 
     } 
     else { 
      [textField1 setText:newString]; 
      [textField2 becomeFirstResponder]; 
      return YES; 
     } 
    } 
    else if(textField == textField2) 
    { 
     if (textField2.text.length > 0 && range.length == 0) 
     { 
      return NO; 
     }else { 
      [textField2 setText:newString]; 
      [textField3 becomeFirstResponder]; 
      return YES; 
     } 
    } 
} 

Мы можем сделать это по-другому ... Объявить эту строку в viewDidLoad и этого метода.

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(endEditingTextField:) name:@"UITextFieldTextDidChangeNotification" object:txtfield1]; 

- (void) endEditingTextField:(NSNotification *)note { 
    if ([[txtfield1 text] length] > 0) 
    { 
     [txtfield1 resignFirstResponder]; 
     [txtfield2 becomeFirstResponder]; 
    } 
} 

Надеюсь, что это помогает ...

+0

не работает? –

+0

Это сработало для меня. В любом случае я добавил еще один способ сделать это. –

0

вы, чтобы просто использовать

[textField'sName becomeFirstResponder]; 
1

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

  1. текущее поле Текст должен уйти в отставку для курсора.
  2. Вычислите следующее текстовое поле:
  3. Сделайте следующее текстовое поле, чтобы получить курсор.

В коде:

if ([currentTextFieldWithCursor canResignFirstResponder]) [currentTextFieldWithCursor resignFirstResponder]; 
UITextField *followingTextField = // just get it! 
if ([followingTextField canBecomeFirstResponder]) [followingTextField becomeFirstResponder]; 

Надеется, что это помогает.

2

Выше решение не работает. Это решение работает для меня:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 

    NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string]; 

    if(firstCodeField == textField){ 
     [firstCodeField setText:newString]; 
     [secondCodeField becomeFirstResponder]; 
    } 
    if(secondCodeField == textField){ 
     [secondCodeField setText:newString]; 
     [thirdCodeField becomeFirstResponder]; 
    } 

    NSUInteger newLength = [textField.text length] + [string length] - range.length; 
    return (newLength > 1) ? NO : YES; 
} 
1

просто установить

UITextFieldDelegate

и мимо этого метода в файле .m. он будет работать для текстовых полей OTP.

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 

    NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string]; 

    if(_txt1 == textField){ 
     if ([_txt1.text length] == 0) { 
      [_txt1 setText:newString]; 
       [_txt2 becomeFirstResponder ]; 
     } 

    } 
    if(_txt2 == textField){ 

     if ([_txt2.text length] == 0) { 
       [_txt2 setText:newString]; 
       [_txt3 becomeFirstResponder]; 
     } 

    } 

    if(_txt3 == textField){ 

     if ([_txt3.text length] == 0) { 
       [_txt3 setText:newString]; 
       [_txt4 becomeFirstResponder]; 
     } 

    } 

    if(_txt4 == textField){ 

     if ([_txt4.text length] == 0) { 
      [_txt4 setText:newString]; 
     } 

    } 

    NSUInteger newLength = [textField.text length] + [string length] - range.length; 
    return (newLength > 1 && newLength == 2) ? NO : YES; 
} 

Надеюсь, что эта работа для любого. :)

Смежные вопросы