2010-06-04 7 views
0

J'utilise champ étiquette comme un drapeau pour le texte champs de champs de vue de texte pour l'auto-saut au champ suivant:Comment réinitialiser le clavier d'un champ de saisie?

- (BOOL)findNextEntryFieldAsResponder:(UIControl *)field { 
    BOOL retVal = NO; 
    for (UIView* aView in mEntryFields) { 
    if (aView.tag == (field.tag + 1)) { 
     [aView becomeFirstResponder]; 
     retVal = YES; 
     break; 
    } 
} 
return retVal; 
} 

Il fonctionne très bien en termes d'auto-saut au champ suivant lorsque la touche suivante est pressée . Cependant, mon cas est que les claviers sont différents de certains champs. Par exemple, un des champs est la ponctuation numérique &, et le suivant est par défaut (clés alphabétiques). Pour le & clavier de ponctuation est OK, mais le champ suivant restera la même mise en page. Il faut que l'utilisateur appuie sur 123 pour revenir au clavier ABC.

Je ne suis pas sûr s'il y a un moyen de réinitialiser le clavier pour un champ comme son clavier défini en xib? Vous ne savez pas si des API sont disponibles? Je suppose que je dois faire quelque chose est le délégué suivant?

-(void)textFieldDidBegingEditing:(UITextField*) textField { 
    // reset to the keyboard to request specific keyboard view? 
    .... 
} 

OK. J'ai trouvé a solution close to my case by slatvik:

-(void) textFieldDidBeginEditing:(UITextField*) textField { 
    textField.keyboardType = UIKeybardTypeAlphabet; 
} 

Cependant, dans le cas des champs de texte précédent est numérique, le clavier reste numérique quand sauté automatiquement au champ suivant. Y at-il un moyen de régler le clavier en mode alphabet?

Répondre

0

Enfin, je trouve un moyen de résoudre mon problème. Dans mon cas, j'aime utiliser la touche Entrée ou Suivant pour passer automatiquement au prochain champ disponible. Si les deux champs en séquence ont des claviers totalement différents, le changement de clavier devrait être bon. Cependant, si l'un est un clavier avec un mode numérique, et l'autre est en mode alphabet, alors le saut automatique ne ferait pas changer le même clavier.

La raison principale est que mon appel à findNextEntryFieldAsResponder: méthode est effectué dans la méthode textFieldShouldReturn: delegate. L'appel a provoqué le champ suivant devient le répondeur:

... 
[aView becomeFirstResponder]; // cause the next fields textFieldDidBeginEditing: event 
... 

J'ai trouvé dans mon message de débogage NSLog:

textFieldShouldReturn: start 
    findNextEntryFieldAsResponder 
    textFieldDidBeginEditing: start 
    ... 
    textFieldDidBeginEditing: end 
    ... 
textFieldShouldReturn: end 

Ce que je dois faire est au champ suivant comme intervenant sur textFieldShouldReturn: événement appel. J'ai essayé d'utiliser le framework de notification local d'iphone pour déclencher un événement de notification asynchrone dans textFieldShouldReturn: et il fait ce que j'attends.

Voici mes codes mise à jour:

- (BOOL)findNextEntryFieldAsResponder:(UIControl *)field { 
    BOOL retVal = NO; 
    for (UIView* aView in mEntryFields) { 
    if (aView.tag == (field.tag + 1)) { 
     if ([self.specialInputs containsObject:[NSNumber numberWithInt:aView.tag]]) { 
     NSNotification* notification = [NSNotification notificationWithName: 
      @"myNotification" object:aView]; 
     [[NSNotificationQueue defaultQueue] 
      enqueueNotification:notification postingStyle:NSPostWhenIdle 
      coaslesceMask:NSNotificationCoalescingOnName forModes:nil]; 
     [[NSNotifiationCenter defaultCenter] addObserver:self 
      selector:@selector(keyboardShowNofication:) 
      name:@"myNotification" object:nil]; 
     } 
     else { 
     [aView becomeFirstResponder]; 
     } 
     retVal = YES; 
     break; 
    } 
    } 
    return retVal; 
} 
... 
// Notification event arrives! 
-(void) keyboardShowNofication:(NSNotification*) notification { 
    UIResponder* responder = [notification object]; 
    if (responder) { 
    [responder becomeFirstResponder]; // now the next field is responder 
    } 
} 
... 
-(void) dealloc { 
    ... 
    // remember to remove all the notifications from the center! 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
    ... 
} 

où specialInputs est un NSArray des valeurs int. C'est une propriété qui peut être définie avec des balises de liste en tant qu'entrées spéciales. En fait, je pense que toutes les entrées peuvent être traitées comme des entrées spéciales et cela fonctionne aussi (juste plus de notifications).

J'ai a complete description of codes in my blog.

Questions connexes