2012-11-21 5 views
1

J'ai plusieurs instances d'une classe personnalisée qui accepte les entrées du clavier. Vous pouvez penser à UITextField (mais ils ne sont pas UITextField, ils sont NSObject). Cependant, ils ont tous une propriété UIControl *control.Reconnaissance du bouton de tabulation pour passer au répondeur suivant

Ces objets sont instanciés et placés dans un tableau (les commandes comptent), et ils sont affichés à l'écran dans le même ordre.

Scénario 1: Onglets utilisateur sur le premier objet, il devient le premier répondeur. L'utilisateur appuie sur un autre objet (de la même classe) et devient le premier répondeur. Aucun problème.

Scénario 2: Onglets utilisateur sur le premier objet, il devient le premier répondeur. L'utilisateur appuie sur le bouton TAB du clavier (iPad ou iPhone ou clavier sans fil), Je souhaite que l'objet suivant dans la matrice devienne le répondeur suivant. iOS choisit au hasard [? ou avec une logique qui ne me semble pas claire] un autre objet qui n'est pas dans le même ordre que je veux.

Problème: Étant donné que ces objets sont NSObject s, comment puis-je intercepter la transition vers l'objet suivant. J'ai essayé d'utiliser des balises ou de suivre qui est le premier répondeur, mais le problème est que si l'utilisateur tape sur un objet dans le désordre, c'est bien - je ne veux pas intercepter ça. Je veux seulement intercepter la transition d'un objet à l'autre seulement si c'est en tapant sur TAB (ou Next ou Return) du clavier.

Une idée? Merci.

+0

pourquoi ne pas faire une propriété dans votre classe personnalisée qui pointe vers l'objet suivant qu'il devrait aller à (avec une référence faible) puis juste faire l'objet le premier intervenant automatiquement lorsque l'onglet/retour est pressé, s'il n'y a aucun objet (comme le dernier) ne se passera rien cuz ce sera un message envoyé à zéro .Je pense que vous pouvez même utiliser le constructeur d'interface pour définir ces propriétés personnalisées. (encore une fois, je ne comprends peut-être pas votre problème) – Pochi

+0

@LuisOscar merci. c'est une option à laquelle je n'ai pas pensé, mais il y a quand même des obstacles: 1) mon plus gros problème est que je ne reçois rien quand on appuie sur le bouton TAB du clavier. Comment puis-je l'obtenir? iOS route cette entrée ailleurs, pas à mon objet. 2) Je préfère que ces objets ne sachent rien les uns des autres - même avec une référence faible. Bien que si je découvre que c'est la seule option, je peux ignorer cela. – Canopus

+0

Utilisez-vous le constructeur d'interface? et vous avez dit qu'ils ne sont pas uitextfield mais ils DOIVENT l'être, ou vous devez avoir un uitextfield quelque part pour montrer au clavier (peut-être une sous-classe d'entre eux) que les avez-vous exactement spécifiés? (comme votre sous-classe personnalisée pourrait avoir un champ uitext, alors celui-ci devient le premier répondeur) au sujet du retour, mal coller le code comme une réponse parce qu'il semble drôle ici – Pochi

Répondre

1

Vous pouvez définir votre classe personnalisée d'avoir quelque chose comme ça

@interface testClassButtonSub : UIButton 

@property (weak,nonatomic) IBOutlet UIButton *nextButton; 

@end 

Ensuite, vous pouvez même utiliser le générateur d'interface pour définir qui sera le prochain intervenant quand une action est prise. (Un utilisateur appuie sur le retour lorsque l'intérieur d'un champ de texte dans votre classe personnalisée)

Pour le retour, vous devez déclarer votre viewcontroller en tant que délégué du textview spécifique.

d'abord vous définissez l'en-tête de viewcontroller comme ceci:

@interface RegisterViewController : UIViewController <UITextFieldDelegate> 

vous définissez les délégués dans la mise en œuvre

// Set Delegates of the Text Fields 
eMail.delegate = self; 
userPassword.delegate = self; 
userNickname.delegate = self; 

et que vous utilisez cette méthode de délégué pour passer à l'objet suivant

- (BOOL)textFieldShouldReturn:(UITextField *)textField 
{  
    // Jumping code here 
    return NO; 
} 

CEPENDANT dans votre cas votre textfield doit être à l'intérieur de votre objet, vous devez donc faire l'objet le délégué, et que le code de l'objet de saut à la mise en œuvre ajoutez le

[thisObjectsTextfield becomeFirstResponder]; 
+0

Merci pour votre réponse, mais il n'y a pas UITextField. La classe est conforme au protocole UIKeyInput. J'ai trouvé ma réponse dans - (void) insertText: (NSString *) texte requis méthode du protocole UIKeyInput. Maintenant, je dois trouver un design pour communiquer cela. – Canopus

+1

essayez ceci http://stackoverflow.com/questions/9592593/how-do-i-detect-the-return-key-being-anded-and-respond-to-it-using-the-uikeyin – Pochi

Questions connexes