2009-08-23 10 views
5

Vorrei creare una finestra di dialogo con codice PIN, come quella che è possibile accendere su iPhone.Creazione dialogo pin-code

Per coloro che non l'hanno visto, si compone di quattro caselle e un tastierino numerico. Quando si inserisce una cifra, nella prima casella appare un punto. E così via. Quando si preme il pulsante Elimina, l'ultimo punto viene rimosso.

ho questo impostato come quattro UITextFields e nel mio delegato I ascoltare:

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

Il pickNext: il metodo passa al successivo UITextField, in questo modo:

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

Questo in realtà funziona, ma il problema per me è che la chiave di cancellazione non produce alcuna notifica quando UITextField è già vuoto. Quindi non ho modo di passare al precedente UITextField.

Così qualcuno ha una migliore idea di come risolvere questo problema. Sto pensando al campo di testo nascosto ... ??

risposta

7

OK, quindi l'ho risolto io stesso. Il campo di testo nascosto era la strada da percorrere. Anche se è nascosto, puoi comunque farlo diventare il primo interlocutore e verrà visualizzata la tastiera.

Quindi, per riassumere:

In viewDidLoad:

[hidden becomeFirstResponder]; 

E poi ascoltare il "Editing Changed" evento e aggiornare le quattro UITextField visibile con un personaggio ciascuna. Come questo:

- (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 = @""; 
} 

di limitare il numero di caratteri nella UITextField nascosta per quattro personaggi a implementare il delegato metodo "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]]; 
} 

E come potete vedere mando una notifica quando il la quarta cifra è stata inserita.

1

Quello che dovete fare è collegare un metodo di ciascuno di evento "ValueChanged" le quattro del UITextField e in quel metodo check per vedere se la lunghezza del testo del mittente è 0.

È possibile collegare evento ValueChanged per la quattro UITextfields fino allo stesso metodo e attiva il tag come sopra. Il seguente codice farà il trucco.

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

Bene, ValueChanged apparentemente non fa nulla per un UITextField, almeno non ho eventi. Ma "Modifica modificata" invia gli eventi, ma ancora una volta, non quando il campo è vuoto e premo il tasto Canc. – Kobski

Problemi correlati