web-dev-qa-db-fra.com

Pourquoi est-ce que devenuFirstResponder ne fonctionne pas?

J'ai ajouté un modal utilisant AGWindowView . Dans la vue modale (construite avec IB), il y a un champ de texte. Le champ de texte a été connecté à une prise.

Cela ne fonctionne pas:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [self.placesTextField becomeFirstResponder];
}

L'appel à becomeFirstResponder ne fonctionne pas et le clavier ne s'affiche pas.

Cela fonctionne:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [self.placesTextField performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0];
}

Cependant, si j'envoie manuellement un message à l'aide de performSelector:withObject:afterDelay, cela fonctionne. Pourquoi cette méthode n'est-elle pas déterminée avant l'exécution?

21
Ravi

On dirait que dans iOS7, la vue/l'objet n'est pas encore attaché dans la hiérarchie/la fenêtre. Donc, appeler une méthode sur un objet échoue. Si nous mettons un peu de retard et que cela fonctionne, cela signifie qu'à ce moment, les objets sont attachés à la fenêtre.

Selon Apple,

Un objet répondeur ne devient le premier répondeur que si le répondeur actuel Peut démissionner du statut de premier répondant (canResignFirstResponder) Et que le nouveau répondant puisse devenir premier répondant.

Vous pouvez appeler cette méthode pour créer un objet répondant, tel qu'une vue, le premier répondant . Cependant, vous ne devriez l'appeler sur cette vue que si Fait partie d'une hiérarchie de vues. Si la propriété window de la vue contient un objet UIWindow, elle a été installée dans une hiérarchie de vues. si renvoie zéro, la vue est séparée de toute hiérarchie.

Pour plus de détails, voir Référence de classe UIResponder .

7
βhargavḯ

Il y a une grosse différence entre votre première et deuxième méthode.

Selon le paramètre delay de performSelector:withObject:afterDelay:

Le temps minimum avant lequel le message est envoyé. La spécification d'un délai de 0 ne provoque pas nécessairement l'exécution immédiate du sélecteur. Le sélecteur est toujours mis en file d’attente sur la boucle d’exécution du thread et exécuté dès que possible.

La seconde méthode attendra jusqu'au moment opportun et exécutera becomeFirstResponder.

0
fujianjin6471