2009-08-23 5 views
5

Je voudrais créer un dialogue de code PIN, comme celui que vous pouvez allumer sur l'iPhone.Création d'un dialogue de code PIN

Pour ceux qui ne l'ont pas vu, il se compose de quatre boîtes et d'un clavier numérique. Lorsque vous entrez un chiffre, un point apparaît dans la première case. Et ainsi de suite. Lorsque vous cliquez sur le bouton Supprimer, le dernier point est supprimé.

Je possède ce mis en place en quatre UITextFields et dans mon délégué-je écouter:

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

Le pickNext: méthode passe à l'autre UITextField, comme ceci:

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

Cette réalité fonctionne, mais le problème pour moi est que la clé de suppression ne produit aucune notification lorsque l'UITextField est déjà vide. Je n'ai donc aucun moyen de passer à l'UITextField précédent.

Alors quelqu'un a-t-il une meilleure idée de la façon de résoudre ce problème? Je pense à un champ de texte caché ... ??

Répondre

7

OK, donc je l'ai résolu moi-même. Le champ de texte caché était le chemin à parcourir. Même s'il est caché, vous pouvez toujours en faire le premier répondeur et le clavier apparaîtra.

Donc, pour résumer:

En viewDidLoad:

[hidden becomeFirstResponder]; 

Et puis j'écouter la « édition Changed » événement et mettre à jour les quatre UITextField visibles avec un caractère chacun. Comme ceci:

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

Pour limiter le nombre de caractères dans le UITextField caché à quatre personnages que j'implémentez la méthode délégué « 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]]; 
} 

Et comme vous pouvez le voir, j'envoie une notification lorsque le le quatrième chiffre a été entré.

1

Ce que vous devez faire est de brancher une place de la méthode de chacun de l'événement « ValueChanged » de quatre UITextField et que l'enregistrement de la méthode pour voir si la longueur du texte de l'expéditeur est 0.

Vous pouvez brancher événement ValueChanged pour la quatre UITextfields jusqu'à la même méthode et allumer la balise que vous faites ci-dessus. Le code suivant fera l'affaire.

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

Eh bien, ValueChanged ne fait apparemment rien pour un UITextField, au moins je n'ai aucun événement. Mais "Modification modifiée" envoie des événements, mais encore une fois, pas lorsque le champ est vide et que j'appuie sur la touche d'effacement. – Kobski

Questions connexes