2014-07-11 3 views
3

J'ai la méthode viewDidLoad suivante:becomeFirstResponder très lent

- (void)viewDidLoad { 
    NSLog(@"didLoad"); 
    if (self.loginField.text.length > 0) [self.passwordField becomeFirstResponder]; 
    else [self.loginField becomeFirstResponder]; 
} 

Je voudrais également ajouter des temps de journaux dans viewWillAppear et viewDidAppear.

Dans certaines situations, l'animation poussée prend beaucoup de temps. J'ai mesuré l'heure avec des lignes if-else commentées (et sans) (voir: les temps sont indiqués ci-dessous). Je ne sais pas ce qui peut ralentir mon application entre viewWillAppear et viewDidAppear appels.

J'ai essayé d'analyser ce fragment de code avec Time Profiler (Instruments), mais cela ne montre rien. Je n'ai aucune idée de ce que je devrais faire, pour montrer ma vue plus rapidement. Des idées?

Avec becomeFirstResponder, premier appel

2014-07-11 16:51:41.090 didLoad 
2014-07-11 16:51:41.133 willAppear 
2014-07-11 16:51:44.223 did appear 
diffAppear = 3090ms 

Avec becomeFirstResponder, deuxième appel

2014-07-11 16:52:01.370 didLoad 
2014-07-11 16:52:01.400 willAppear 
2014-07-11 16:52:02.109 did appear 
diffAppear = 709ms 

Sans becomeFirstResponder, premier appel

2014-07-11 16:57:21.720 didLoad 
2014-07-11 16:57:21.754 willAppear 
2014-07-11 16:57:22.420 did appear 
diffAppear = 666ms 

Sans becomeFirstResponder, deuxième appel

2014-07-11 16:57:31.851 didLoad 
2014-07-11 16:57:31.870 willAppear 
2014-07-11 16:57:32.541 did appear 
diffAppear = 671ms 
+1

le '-becomeFirstResponser' charge normalement les _input views_ pour l'objet réel qui prend du temps. d'autre part, vous devriez appeler cette méthode _after_ votre vue est dans la pile de navigation et dans la hiérarchie de vue correctement, ce qui signifie dans ce cas: _in_ ou _after_ la méthode '-viewDidAppear:', pas plus tôt. – holex

+0

Mais alors le clavier n'apparaîtra pas immidietly – Szu

+0

oui, c'est vrai, mais ce n'est pas une bonne pratique et comme vous avez vu - est extrêmement lent. – holex

Répondre

0

Comme Métion @holex dans les commentaires:

la -becomeFirstResponser charge normalement les vues d'entrée pour le objet réel qui prend du temps. d'autre part, vous devez appeler cette méthode après que votre vue soit dans la pile de navigation et dans la hiérarchie de vues correctement, ce qui signifie dans ce cas: dans ou après la méthode -viewDidAppear: pas plus tôt.

J'ai déplacé –becomeFirstResponser à -viewDidAppear:. Maintenant, selon ce question j'ai ajouté ces observateurs comme indiqué ci-dessous et maintenant l'application comme il se doit. Ce n'est pas une solution parfaite (l'animation par poussée n'a pas de clavier) mais est assez bonne pour moi.

+0

Si cela résout la question, veuillez le mentionner explicitement. – Eonil