Retard lors de l'utilisation de instantiateViewControllerWithIdentifier mais pas performSegueWithIdentifier?

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.

  1. Cliquez et maintenez le button Créer dans votre window xcode. Vous verrez quatre options apparaître, select Profil .
  2. Une fois la construction exécutée, une window avec des instruments apparaîtra. Sélectionnez, Time Profiling parmi les options.
  3. Une nouvelle window apparaîtra avec diverses mésortingques. Le coin supérieur gauche aura un button d'logging rouge . Cliquez sur le button rouge d'logging et cela lancera l'application sur votre téléphone.
  4. Procéder à la transition en vous donnant des problèmes. Terminez l'logging après la transition en sélectionnant le même button avec lequel vous avez commencé l'logging.
  5. Passez en revue le volet "Détails" dans le coin inférieur gauche. Vous verrez une colonne intitulée "Temps d'exécution" qui montre le time qu'il a fallu pour exécuter chaque méthode dans votre code (à la fois les methods du operating system et le code généré par l'user)
  6. Déterminer si quelque chose est hors de propos ou se produit qui n'est pas prévu. Peut-être revenir en arrière et exécuter la transition à nouveau pour comparer la différence entre les deux. Cliquer sur la fonction dans la list vous amènera directement au code en cours d'exécution. Cela peut être très utile.

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.