Le code ci-dessous est utilisé pour pousser un autre controller de vue sur la stack de navigation.
Lors de l'utilisation de instantiateViewControllerWithIdentifier
, le segue est sensiblement lent la première fois (~ 3 secondes), mais se produit raisonnablement rapidement chaque fois. D'autres messages de SO ont suggéré de s'assurer que le segue se produise sur le thread principal, ce que le code accomplit, mais cela n'a pas résolu le problème.
Cependant, l'utilisation de performSegueWithIdentifier
ne provoque aucun retard.
Le code viewDidLoad
de SendViewController
est le même pour le premier et les suivants.
Essayé d' viewDidLoad
pour le controller de vue de destination, mais le décalage existe toujours pour instantiateViewControllerWithIdentifier
mais pas pour performSegueWithIdentifier
.
Comment réparer le retard avec instantiateViewControllerWithIdentifier
?
Sans timeouts:
@IBAction func buttonTapped(sender: UIButton) { performSegueWithIdentifier(SendSegue, sender: self) }
Résultats en retard lors de l'affichage de SendViewController pour la première fois:
@IBAction func buttonTapped(sender: UIButton) { dispatch_async(dispatch_get_main_queue()) { let vc = self.storyboard!.instantiateViewControllerWithIdentifier(self.SendViewControllerID) as! SendViewController self.navigationController!.pushViewController(vc, animated: true) } }
Ce problème peut se produire dans de nombreux scénarios différents. La meilleure façon de déterminer ce qui cause votre problème spécifique est de profiler avec les instruments inclus dans Xcode.
Il est très probable que si une transition prend 3-5 secondes, une fonction particulière sera évidente en suivant ces étapes. Bon profilage!
WWDC de l'année dernière a également un bon segment sur ce sujet. La valeur vaut la peine d'être vérifiée ici: (ouvrir dans Safari seulement) WWDC Profiling Talk
Le problème a été isolé à la présence d'un UITextField dans le controller de vue de destination, c'est-à-dire que la suppression de UITextField supprime le décalage.
Ensuite, il a été davantage isolé à la présence d'une police personnalisée.
En d'autres termes, l'utilisation de la police système sur l'UITextField, plutôt que d'une police personnalisée, supprime le décalage. Aucune explication pourquoi, mais cela fonctionne.