J'ai une application qui presque fonctionne parfaitement. Voici comment mon application est structurée:
6 contrôleurs de vue au total sur le storyboard. Les 3 premiers contrôleurs de vue sont les plus importants. Le contrôleur de vue initial a des boutons pour "Connexion" et "Inscription". Le bouton "Connexion" présente de façon modale un contrôleur de vue d'ouverture de session et le bouton "Inscription" présente de manière modale un contrôleur de vue d'inscription.
Le Signup View Controller possède 3 champs pour le nom d'utilisateur, le mot de passe et l'e-mail, puis un bouton "soumettre". Le bouton Soumettre soumet les données à mon serveur Web et si tout se passe correctement, il appelle la méthode "performSegueWithIdentifier" sur lui-même.
Voici la déclaration:
[self performSegueWithIdentifier:@"superSegue" sender:self];
J'ai passé 2 heures ce soir à essayer de faire fonctionner l'appel de méthode ci-dessus et cela fonctionne finalement. Pour le faire fonctionner, j'ai dû sélectionner mon contrôleur de vue d'inscription sur le storyboard et aller dans Éditeur> Intégrer dans> Contrôleur de navigation (si je me souviens bien, je devais le faire car le contrôleur de vue d'inscription est présenté de façon modale). J'ai ensuite glissé du bouton d'envoi de mon contrôleur View Signup vers le contrôleur View vers lequel je veux pousser et j'ai sélectionné Push, puis j'ai tapé un nom d'identifiant.
Quoi qu'il en soit, tout ce qui précède fonctionne parfaitement bien jusqu'à ce que j'essaie d'utiliser le bouton de retour sur le contrôleur de vue que nous avons poussé à utiliser l'appel de méthode. Si j'appuie sur le bouton de retour, il passe à un écran noir à 90% avec une barre de navigation vierge en haut avec un bouton de retour et bien sûr, ce bouton de retour ne fait rien de bien.
Voici l'erreur que j'obtiens dans la console:
Unbalanced calls to begin/end appearance transitions for <VerificationViewController: 0x14ed1bb0>
Verification View Controller est le View Controller vers lequel le Signup View Controller pousse via la méthode performSegueWithIdentifier.
Est-ce que quelqu'un sait comment je peux corriger cette erreur?
J'ai inclus une capture d'écran ci-dessous à quoi ressemble mon storyboard dans xcode. Il y a un contrôleur de vue que j'ai codé mais pas encore connecté et ne devrait pas faire de différence de toute façon, vous pouvez donc ignorer le contrôleur de vue à droite du VC de connexion.
J'ai trouvé la réponse ce matin dans une autre question de stackoverflow. La réponse peut être trouvée ici .
Lorsque j'avais initialement configuré le Push Segue, j'ai cliqué sur un bouton et je l'ai glissé depuis un bouton, et j'appelais également la méthode performSegueWIthIdentifier dans l'implémentation de la méthode IBAction de ce bouton. Cela provoquait l'exécution de 2 séquences de poussée identiques sur la touche. Je viens de laisser mon appel de méthode dans l'IBAction, j'ai supprimé l'ancien enchaînement Push et j'ai créé un nouvel enchaînement Push uniquement cette fois-ci. J'ai cliqué sur et fait glisser depuis l'intégralité du contrôleur de vue au lieu de son bouton.
J'ai résolu ce problème en enveloppant cela.
dispatch_async(dispatch_get_main_queue()) {
//call your performSegueWithIdentifier in here
}
Dans mon cas, c'était une sous-classe de UITabBarController
avec une surcharge setSelectedIndex:
méthode qui effectue la transition avec une animation. J'ai constaté que les éléments suivants doivent être appelés avant le début de l'animation:
[sourceVC viewWillDisappear:YES];
[destinationVC viewWillAppear:YES];
Et ce qui suit dans le bloc d'achèvement:
if (finished) {
[sourceVC viewDidDisappear:YES];
[destinationVC viewDidAppear:YES];
[super setSelectedIndex:selectedIndex];
}
Le problème peut toujours se produire si plusieurs modifications selectedIndex se produisent avant la fin des animations.
Raison de l'erreur: ce message s'affiche si vous poussez/présentez un autre contrôleur View à partir de la méthode viewWillAppear, loadView, init ou viewDidLoad du contrôleur View actuel
Solution: Déplacez votre code poussant/présentant vers la méthode viewDidAppear résoudra le problème
La raison en est: dans viewDidLoad, toutes les animations fantaisie ne sont pas déjà terminées, tandis que dans viewDidAppear, tout est fait.
Je l'ai travaillé et c'est bon pour moi Raison de l'erreur: Ce message s'affiche si vous poussez/présentez un autre contrôleur View de TabBarController, Solution: veuillez définir viewController.modalPresentationStyle = .overCurrentContext
, Puis présenter viewController
topViewController.present(vc, animated: true, completion: nil)
Dans mon cas, cet avertissement a été provoqué par l'appel de popToRootViewController
de UINavigationController alors que la vue modale était affichée. Lorsque j'ai déplacé popToRootViewController
après la fin de la vue modale, un avertissement s'arrête.