2010-10-15 8 views
13

Lorsqu'un clavier matériel est utilisé avec iOS, appuyer sur la touche Tab ou Maj-Tab accède automatiquement au répondeur logique suivant ou précédent, respectivement. Existe-t-il un moyen de faire la même chose par programme (c'est-à-dire de simuler la touche de tabulation plutôt que de suivre manuellement l'ordre logique)?Simuler la touche de tabulation Appuyer sur iOS SDK

+6

en double de la question: http://stackoverflow.com/questions/3241966/ focus-sur-next-valid-key-view-on-iphone qui a eu une bonne réponse. –

Répondre

0

Vous ne savez pas si cela aide, mais dans le contexte d'un UITextFields, si vous implémentez UITextFieldDelegate, - (BOOL)textFieldShouldReturn:(UITextField *)textField sera appelée lorsque la touche de retour du clavier logiciel est enfoncée. J'ai essayé de frapper directement sur mon clavier d'ordinateur portable et il a semblé sauter entre tous les champs de texte dans l'ordre dans lequel vous les avez ajoutés à la vue, mais je n'ai pas utilisé d'autres types de champs (Boutons etc.).

La touche du clavier simule la touche du clavier logiciel du simulateur, qui fonctionne comme prévu.

3

Vous pouvez définir "l'ordre des tabulations" en utilisant la propriété de l'étiquette. Le message suivant décrit comment trouver l'index de balise suivant pour UITextField s, How to navigate through textfields (Next/Done Buttons).

Voici une version modifiée du code de cet article. Au lieu de supprimer le clavier au dernier index de balise, le code suivant tentera de revenir au premier index de balise.

-(BOOL)textFieldShouldReturn:(UITextField*)textField; 
{ 
    NSInteger nextTag = textField.tag + 1; 
    // Try to find next responder 
    UIResponder* nextResponder = [textField.superview viewWithTag:nextTag]; 
    if (nextResponder) { 
    // Found next responder, so set it. 
    [nextResponder becomeFirstResponder]; 

    return NO; 
    } 

    // Try to find the first responder instead... 
    // Assuming the first tag index is 1 
    UIResponder* firstResponder = [textField.superview viewWithTag:1]; 
    if (firstResponder) { 
    // loop back to the first responder 
    [firstResponder becomeFirstResponder]; 
    } else { 
    // Not found, so remove keyboard. 
    [textField resignFirstResponder]; 
    } 

    return NO; // We do not want UITextField to insert line-breaks. 
} 

Si vous voulez un élément d'interface utilisateur autre que UITextField, vous devriez toujours être en mesure d'utiliser la même logique, avec quelques contrôles.

8

Comme William Niu a raison, mais vous pouvez également utiliser ce code expliqué ci-dessous.

Je l'ai utilisé cela et obtenu success.Now Prenons l'exemple de UITextField ...

Vous pouvez utiliser la méthode déléguée de UITextView -(BOOL)textFieldShouldReturn:(UITextField*)textField comme expliqué ci-dessous. Mais avant cela, vous devez donner un tag à chaque UITextField dans un ordre d'incrément ... (L'ordre d'incrément n'est pas nécessaire, mais pour mon code, il est nécessaire, vous pouvez également utiliser l'ordre décroissant mais du code changements pour ce faire)

- (BOOL)textFieldShouldReturn:(UITextField *)textField { 

    NSInteger nextTag = textField.tag + 1; 
    UIResponder* nextResponder = [self.view viewWithTag:nextTag]; 
    if (nextResponder) { 
     [nextResponder becomeFirstResponder];  
    } else { 
     [textField resignFirstResponder]; 
    } 
    return YES; 
} 

Espérons que cela fonctionnera pour vous ...

Bonne programmation ....

+0

Cela fonctionne avec des champs de texte statiques, et est en fait une excellente approche, mais tout va bien si vos champs de texte sont dans des cellules viewview réutilisables. – n00neimp0rtant

Questions connexes