2009-08-23 22 views
5

Me gustaría crear un diálogo de código pin, como el que puede activar en el iPhone.Crear un diálogo de código pin

Para aquellos que no lo han visto, se compone de cuatro cuadros y un teclado numérico. Cuando ingresa un dígito, aparece un punto en el primer cuadro. Etcétera. Cuando presionas el botón Eliminar, se elimina el último punto.

tengo esta establecido como cuatro UITextFields y en mi delegado Yo escucho:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
    [self performSelector:@selector(pickNext:) withObject:textField afterDelay:0.0]; 
    return YES; 
} 

El pickNext: método cambiará a la siguiente UITextField, así:

- (void)pickNext:(UITextField*)textField 
{ 
    switch ([textField tag]) { 
    case 1: 
     [pin2 becomeFirstResponder]; 
     break; 
    case 2: 
     [pin3 becomeFirstResponder]; 
     break; 
    case 3: 
     [pin4 becomeFirstResponder]; 
     break; 
    case 4: 
     [textField resignFirstResponder]; 
     break; 
    default: 
     break; 
    } 
} 

Esta realidad funciona, pero el problema para mí es que la clave de eliminación no produce ninguna notificación cuando el UITextField ya está vacío. Entonces no tengo forma de moverme al UITextField anterior.

Entonces, ¿alguien tiene una mejor sugestión de cómo resolver este problema. Estoy pensando en el campo de texto oculto ... ??

Respuesta

7

Bien, así que lo resolví yo mismo. El campo de texto oculto era el camino a seguir. Aunque esté oculto, aún así puedes convertirlo en el primer respondedor y aparecerá el teclado.

Entonces, para resumir:

En viewDidLoad:

[hidden becomeFirstResponder]; 

Y luego detectar el evento "Edición Changed" y actualizar los cuatro UITextField visible con cada uno de los personajes. De esta manera:

- (IBAction)textChanged:(UITextField*)hiddenField 
{ 
    NSString *hiddenText = hiddenField.text; 

    [self setOneTextField:pin1 toString:hiddenText atIndex:0]; 
    [self setOneTextField:pin2 toString:hiddenText atIndex:1]; 
    [self setOneTextField:pin3 toString:hiddenText atIndex:2]; 
    [self setOneTextField:pin4 toString:hiddenText atIndex:3]; 
} 

- (void)setOneTextField:(UITextField*)textField toString:(NSString*)string atIndex:(NSInteger)index 
{ 
    if ([string length] > index) 
    textField.text = [string substringWithRange:NSMakeRange(index, 1)]; 
    else 
    textField.text = @""; 
} 

de limitar el número de caracteres en la UITextField oculto a cuatro caracteres implemento el delegado método "shouldChangeCharactersInRange":

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
    bool okToEdit = YES; 

    if (range.location > 3) 
    { 
    okToEdit = NO; 
    } else if (range.location == 3) { 
    [self performSelector:@selector(sendPinCodeNotification) withObject:nil afterDelay:0.0]; 
    } 
    return okToEdit; 
} 

- (void)sendPinCodeNotification 
{ 
    [[NSNotificationCenter defaultCenter] postNotificationName:PINCODE_NOTIFICATION object:[NSString stringWithFormat:@"%@%@%@%@", pin1.text, pin2.text, pin3.text, pin4.text]]; 
} 

Y como se puede ver que envío una notificación cuando el cuarto dígito ha sido ingresado.

1

Lo que hay que hacer es conectar un método de cada uno de evento "ValueChanged" los cuatro de UITextField y en el registro de entrada método para ver si la longitud del texto del remitente es 0.

Puede conectar caso ValueChanged para el cuatro UITextfields hasta el mismo método y enciéndalo como lo hace arriba. El siguiente código hará el truco.

-(IBAction) pinChanged: (id)sender { 

    UITextField *currentField = (UITextField*) sender; 

    // if the field thqt has just been changed is blank 
    if ([currentField.text length] == 0) { 

     // switch on the fields tag, and go to the previous field 
     switch (currentField.tag) { 
      case 1: 
       // in first field already, stay here! 
       break; 
      case 2: 
       // go back to previous field 
       [pin1 becomeFirstResponder]; 
       break; 
      case 3: 
       // go back to previous field 
       [pin2 becomeFirstResponder]; 
       break; 
      case 4: 
       // go back to previous field 
       [pin3 becomeFirstResponder]; 
       break; 
      default: 
       break; 
     } 
    } 
} 
+0

Bueno, ValueChanged aparentemente no hace nada por un UITextField, al menos no recibo ningún evento. Pero "Edición modificada" envía eventos, pero nuevamente, no cuando el campo está vacío y pulso la tecla de borrar. – Kobski

Cuestiones relacionadas