2009-12-08 15 views
5

Estoy desarrollando una aplicación donde estoy creando algo de UITextField programáticamente, y permito un máximo de 1 carácter en el UITextField.cómo mover el cursor al siguiente UITextField programáticamente?

Esto funciona perfectamente.

Pero después de escribir el carácter, el usuario tiene que tocar de nuevo en la próxima UITextField para presentar el teclado

Después de escribir 1 carácter del cursor debe moverse automáticamente a la próxima UITextField.

¿Cómo puedo hacer eso?

Respuesta

16

Capture al delegado que le informa que su campo de texto ha sido cambiado. Verifique si la nueva longitud es 1. Si es así, llame al becomeFirstResponder en el siguiente campo.

+0

¿cómo se hace esto? ¿Puedes mostrar un código de muestra por favor? – quantum

+0

'[textField becomeFirstResponder]' – akashivskyy

4

He encontrado este enfoque ..

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

Podemos hacerlo de otra manera ... Declarar esta línea en viewDidLoad y ese método.

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

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

Espero que esto ayude ...

+0

no funciona? –

+0

funcionó para mí. De cualquier forma, agregué otra forma de hacer esto. –

0

que has de usar sólo

[textField'sName becomeFirstResponder]; 
1

Esto se puede hacer en 3 sencillos pasos:

  1. el campo de texto actuales deben renunciar por el cursor.
  2. Calcule el siguiente campo de texto
  3. Haga que el siguiente campo de texto gane el cursor.

En código:

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

espero que ayude.

2

La solución anterior no funcionó. Esta solución funciona para mí:

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

apenas se fija

UITextFieldDelegate

y más allá de este método en su archivo .m. Funcionará para cuadros de texto 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; 
} 

Espero que este trabajo para cualquier persona. :)

Cuestiones relacionadas