Appels déséquilibrés pour commencer / terminer les transitions d'apparence pour <FirstViewController: 0x2a2c00>


93

J'ai ce problème lorsque je simule mon application, ce n'est pas une erreur ou un avertissement, mais il apparaît dans ma console, est-ce que quelqu'un a déjà connu cela auparavant?


faites-vous une sorte d'animation dans ce contrôleur de vue?

1
Oui. J'ai une animation d'ouverture qui glisse sur les images à part, j'ai maintenant remarqué que cette erreur ne se produit que lorsque je charge du code sur le téléphone.
C.Johns

le message d'erreur vous suggère de commencer une transition mais il manque un appel à la méthode de fin correspondante.

1
J'ai la même chose. Une solution pour ça?
seeafish

Vous cherchez également une résolution à ce
problème

Réponses:


48

Dans mon cas, cette erreur se produit lorsque vous cliquez très rapidement sur deux onglets dans une vue de table.

Le résultat provoque un nom de titre incorrect, le bouton de retour disparaît Quelqu'un a mentionné que lorsque vous poussez une vue,set animated:NO . L'erreur disparaîtra mais provoquera toujours un comportement étrange. Il pousse deux vues, puis vous devez revenir en arrière deux fois pour revenir à l'écran de vue de la table.

Méthode que j'ai essayée pour résoudre ce problème:

ajouter BOOL cellSelected;

dans viewWillAppear cellSelected = YES;

dans le délégué didselectcell if (cellSelected){cellSelected = NO; do action ; }

Cela permet d'éviter de cliquer très rapidement sur deux cellules différentes.


5
Je suppose qu'une partie du libellé était difficile à comprendre. J'ai fait quelques modifications pour augmenter la lisibilité.
Kyle Clegg

42

Dans mon cas, cela s'est produit lorsque j'ai déclenché [self performSegueWithIdentifier:@"SomeIdentifier" sender:self];dans UINavigationControllerla viewDidLoadméthode d' un élément .

Le déplacer dans la viewDidAppearméthode a résolu le problème.

La raison est très probable que dans viewDidLoadtoutes les animations de fantaisie ne sont pas déjà terminées, alors que viewDidAppeartout est fait.


Merci. Je m'étais perdu à l'époque des hommes des cavernes où je créais chaque élément de l'interface utilisateur à travers le code. Les trucs de storyboard sont nouveaux pour moi.
Kiran Kulkarni


15

Vous devez exécuter votre code dans une boucle différente pour éviter cela

 double delayInSeconds = 0.1;
        dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
        dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
            // Put your code here
[self presentViewController:self.yourModalVC animated:YES completion:nil];
        });

7
Une meilleure idée consiste à enfermer l'animation de présentation dans une dispatch_asyncfile d'attente principale. Le problème dispatch_asyncest qu'il attend que toutes les autres animations de la file d'attente principale soient terminées. c'est bien mieux que d'utiliser un délai parce que: 1- vous ne saurez jamais si un délai est suffisant, cela dépend de votre appareil hôte 2- vous finirez par exagérer le délai et quelque chose retardera. essayez ceci:dispatch_async(dispatch_get_main_queue(), ^{[self presentViewController:self.yourModalVC animated:YES completion:nil];});
M. Porooshani

12

J'ai eu beaucoup de problème avec le même problème. J'ai résolu ça de cette façon

1) Vous n'utilisez pas l' UIViewController'sinitialiseur désigné initWithNibName:bundle:. Essayez de l'utiliser au lieu de simplementinit .

2) réglé animated:YESsur NON, et cela a résolu le problème. par exemple.[self.navigationController pushViewController: viewController_Obj animated:NO];


7

J'ai eu le même problème en utilisant le contrôleur de navigation et en poussant d'autres contrôleurs dessus. J'ai essayé d'utiliser Buffered Navigation Controller et plusieurs autres approches, mais cela n'a pas fonctionné pour moi. Après avoir passé du temps à le comprendre, j'ai remarqué que ce problème se produit si vous essayez de pousser un nouveau contrôleur de vue alors que la transaction précédente (animation) est en cours (durée d'environ 0,5 seconde, je suppose). Quoi qu'il en soit, j'ai fait une solution rapide en déléguant le contrôleur de navigation et en attendant la fin de l'animation précédente.


Je vous remercie! Déplacer ma logique vers viewDidAppear m'a aidé dans ma situation.
Jaroslav

7

Assurez-vous de ne pas oublier dans -viewWillAppear, -viewDidAppear, -viewDidLoad, -viewWillDisappear, -viewDidDisappear d'appeler la super méthode appropriée dans votre surcharge de ces méthodes. Par exemple, dans mon cas, j'ai un nom de méthode incompatible comme celui-ci:

-(void)viewDidAppear
{
 [super viewDidDisappear];
 //some code staff
 ..
}

remarquez que les méthodes d' apparition et de disparition ne correspondent pas


Je viens de passer environ deux heures à déboguer ce problème et c'est ce qu'il s'est avéré être. Appel à l' super.viewWillAppear()intérieur viewDidDisappear().
Daniel Wood

Merci pour cette astuce. Ce n'était pas mon seul problème, mais ça m'a aidé!
Anthony C le

4

"Appels déséquilibrés pour commencer / terminer les transitions d'apparence pour"

Dit qu'une animation est lancée avant que la dernière animation associée ne soit terminée. Alors, ouvrez-vous un contrôleur de vue avant de pousser le nouveau? Ou peut-être sauter à la racine? si oui, essayez de le faire sans animation ie[self.navigationController popToRootViewControllerAnimated:NO];

Et voir si cela résout le problème, dans mon cas, cela a fait l'affaire.


1
C'est la clé: pop ou changer d'autres transitions de viewcontroller en même temps.
Rocky

2

J'ai eu ce problème parce que j'appelais un UIPrintInteractionController à partir d'un viewController sans UITabbar, et ni UINavigationBar. Il semble que le UIPrintInteractionController n'a pas obtenu le printInteractionControllerParentViewController correct. L'implémentation de la méthode dans le délégué et le retour du rootViewController actuel a fonctionné pour moi.

    - (UIViewController*)printInteractionControllerParentViewController:(UIPrintInteractionController*)printInteractionController;

2

J'ai eu un problème similaire qui impliquait le rembobinage des dialogues modaux. Posté la solution ici ...

https://stackoverflow.com/a/38795258/324479

[Problème]

Nav Controller -> VC1 -Push -> VC2 -PopOver ou Modal Segue -> VC3.

VC3 revient à VC1.

Lorsque le segment de VC2 à VC3 est PopOver et Modal, le déroulement se termine par un avertissement: Appels déséquilibrés pour commencer / terminer les transitions d'apparence pour UIViewController "

Si le Segue de VC à VC est push, l'avertissement est parti.

[Solution]

Ce serait formidable si la logique de déroulement prendrait soin de cela. C'est peut-être un bug, peut-être pas. Dans tous les cas, la solution est de faire de VC2 (le contrôleur qui a le popup) la cible du rembobinage, puis d'attendre qu'il finisse d'apparaître avant de faire apparaître le contrôleur de navigation. Cela garantit que l'animation de rembobinage (popup inversé) a suffisamment de temps pour se terminer avant de revenir en arrière. Même avec les animations désactivées, il faut encore attendre sinon vous obtenez l'erreur.

Votre code pour VC2 doit être le suivant. (Rapide)

class VC2: UIViewController {
    private var unwind = false
    @IBAction func unwindToVC1(segue:UIStoryboardSegue) {
        unwind = true
    }

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)

        if unwind {
            self.navigationController?.popViewControllerAnimated(false)
        }
    }
}

1

La situation peut se produire si vous ajoutez une vue avec un contrôleur de vue modale comme vue secondaire. Meilleur à utiliser:

-(void) viewDidAppear:(BOOL)animated {
    [self presentViewController:self.yourModalVC animated:YES completion:nil];
}

Cela signifie essentiellement que le cycle de vie de la vue n'est pas rationalisé pour les viewControllers que vous essayez d'afficher alors.


1

J'ai le même problème en essayant de faire:

[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:2] animated:YES];

dans une fonction comme - (void) popUpToLevelTwo;, et mettre un return;à la fin de la fonction résout le problème


1

J'ai aussi ça à

[self dismissModalViewControllerAnimated:YES];

J'ai changé le YESen a NO, et cela a résolu le problème.


1

J'ai le même problème lorsque j'ai utilisé la méthode pop de navigationcontroller Dans mon application, j'utilise une logique distincte pour le contrôleur de navigation, donc évité l'utilisation de la barre de navigation et elle est toujours masquée. Ensuite, j'utilise une vue et une notification personnalisées pour gérer le bouton arrière et ses événements. les observateurs de notification sont enregistrés et non supprimés. Ainsi, la notification se déclenche deux fois et crée l'erreur mentionnée ci-dessus. Vérifiez votre code à fond pour obtenir de tels défauts


1

Pour ce que ça vaut, j'ai eu cette même erreur en n'incluant pas un appel à [super viewDidLoad:animated]dans mon viewDidLoadremplacement.


1
vous voulez peut-être dire viewDidAppear? viewDidLoad n'a pas de paramètres
Fabio Napodano

1

J'ai également eu ce problème lorsque j'ai tapé sur un bouton d'un NIB. Il s'avère que j'avais accidentellement câblé le bouton pour envoyer un événement à deux méthodes IBAction, chacune faisant un pushViewController: animated:


Merci !! vous économisez mon temps !!
VD du

1

J'ai mis en place une logique pour attendre en poussant le UIViewControllerjusqu'à ce que toutes les données soient téléchargées. Il y avait une erreur dans cette logique qui a fait pousser leUIViewController trop tôt alors qu'il y avait encore un autre appel d'API en cours.

Il a poussé la même chose UIViewControllerdeux fois par le UINavigationControlleret a donné cet avertissement.


1

Cause du message: Ce message ne sera pas affiché si et seulement si vous poussez / présenter un autre contrôleur Vue viewWillAppear, loadView, initou viewDidLoadméthode de régulateur de courant Voir

viewDidAppearMéthode de suppression du message d'erreur: déplacer votre code de poussée / présentation vers la méthode résoudra le problème


1

Swift 4

Mon problème était que je présentais un autre VC avant que mon actuel ne soit rendu.

La solution était de présenter mon nextVC après un bref délai.

CE QUE VOUS NE DEVRIEZ PAS FAIRE

override func viewDidLoad() {
    super.viewDidLoad() 
    self.present(MyNextVC(), animated: true, completion: nil)
}

CE QUE TU DEVRAIS FAIRE

override func viewDidLoad() {
    super.viewDidLoad() 
    //Wait until the view finished to be constructed
    perform(#selector(showMyNextVC), with: nil, afterDelay: 0.01)
}

@objc func showCityList() {
    self.present(MyNextVC(), animated: true, completion: nil)
}

1
Plutôt que d'utiliser un délai, je mettrais le code dans viewDidAppear ou viewDidLayoutSubviews.
Pranav Kasetti

0

J'ai eu ce problème lorsque j'ai oublié de régler Break; après avoir poussé la vue dans une instruction switch!

Comme ici:

case 1:{

        SomeViewController *someViewController = [[SomeViewController alloc]initWithNibName:@"SomeViewController" bundle:Nil];
        [self.navigationController pushViewController:someViewController animated:YES];
        [someViewController release];
    }

        break; //Forgetting to set break here:

0

la raison de l'erreur «Appels déséquilibrés pour commencer / terminer les transitions d'apparence» est lorsque vous naviguez | segue deux fois en même temps


0

une solution serait,

[NSTimer scheduledTimerWithTimeInterval:0.05(or as required) target:self
selector:@selector(your_selector_method_to_push_the_view) userInfo:nil repeats:NO];

0

Vous pouvez rencontrer cela si vous essayez de fermer un UIViewController avant qu'il ne soit fini de charger.

J'avais ce message dans la console et je me concentrais entièrement sur l'UIViewController qui présentait le nouveau UIViewController, sans succès. J'ai finalement découvert que le problème était dans l'UIViewController que je présentais se rejetait parce que l'utilisateur n'était pas connecté à son compte.

J'espère que cela aide quelqu'un.


0

C'était difficile pour moi: j'ai dépassé

override func shouldAutomaticallyForwardRotationMethods() -> Bool {
    return true
}

sans écraser:

override func shouldAutomaticallyForwardAppearanceMethods() -> Bool {
    return true
}

dans mon contrôleur de navigation racine de fenêtre. puis un contrôleur de navigation enfant s'est plaint en poussant un autre contrôleur de vue avec l'avertissement mentionné ci-dessus. L'avertissement n'était pas le pire, le gros problème était que là-bas, le délégué du contrôleur de navigation enfant n'était plus appelé. weired.


0

Dans mon cas, j'allais chercher NSDatade l' NSURLintérieur ' viewDidLoad' méthode.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.