2009-08-23 15 views
5

Chciałbym utworzyć dialog kodu PIN, taki jak ten, który można włączyć w telefonie iPhone.Tworzenie dialogu z kodem PIN

Dla tych, którzy jeszcze jej nie widzieli, składa się z czterech pól i klawiatury numerycznej. Po wprowadzeniu cyfry w pierwszym polu pojawi się kropka. I tak dalej. Po naciśnięciu przycisku usuwania ostatnia kropka zostanie usunięta.

mam to skonfigurować jako cztery UITextFields i moim delegatem słucham:

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

The pickNext: metoda przejdzie do następnego UITextField, jak to:

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

to rzeczywiście działa, ale problem polega na tym, że klucz delete nie generuje żadnego powiadomienia, gdy UITextField jest już pusty. Więc nie mam możliwości przejścia do poprzedniego UITextField.

Czy ktoś ma lepsze sugestie, jak rozwiązać ten problem. Myślę o ukrytym textfield ... ??

Odpowiedz

7

OK, więc sam to rozwiązałem. Ukryte pole tekstowe było drogą do zrobienia. Mimo że jest ukryty, nadal możesz go ustawić jako pierwszą, a klawiatura wyświetli się.

Więc Podsumowując:

W viewDidLoad:

[hidden becomeFirstResponder]; 

I wtedy słuchać na "Edycja changed" zdarzenia i zaktualizować cztery widzialne UITextField z jednego znaku każdego. Tak:

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

Aby ograniczyć liczbę znaków w ukrytym UITextField do czterech znaków zaimplementować delegata metoda „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]]; 
} 

I jak widać wysłać powiadomienie, gdy czwarta cyfra została wprowadzona.

1

Co trzeba zrobić, to hak metoda A up każdego „valueChanged” wydarzenie czterech UITextField iw tej kontroli metoda aby sprawdzić, czy długość tekstu nadawcy 0.

można zahaczyć zdarzenie valueChanged dla cztery pola UIText do tej samej metody i włącz tag, jak robisz powyżej. Poniższy kod wystarczy.

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

Cóż, ValueChanged najwyraźniej nie robi nic dla UITextField, przynajmniej nie dostaję żadnych zdarzeń. Ale "Edycja zmieniona" wysyła zdarzenia, ale znowu, nie wtedy, gdy pole jest puste i trafiam klawisz usuwania. – Kobski