web-dev-qa-db-fra.com

Appels non équilibrés pour les transitions d'apparence début/fin pour <FirstViewController: 0x2a2c00>

J'ai ce problème lorsque je simule mon application, ce n'est pas une erreur ni un avertissement, mais il apparaît dans ma console. Quelqu'un l'a-t-il déjà expérimenté?

88
C.Johns

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 faux titre, le bouton Précédent disparaît. Quelqu'un a mentionné cela lorsque vous appuyez sur une vue, set animated:NO. L'erreur disparaîtra mais provoquera toujours un comportement étrange. Il pousse deux vues, puis vous devez revenir deux fois pour revenir à l'écran tableview.

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

ajouter BOOL cellSelected;

dans viewWillAppearcellSelected = YES;

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

Cela évite de cliquer très rapidement sur deux cellules différentes.

48
chings228

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

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

La raison la plus probable est que, dans viewDidLoad, toutes les animations de fantaisie ne sont pas déjà terminées, alors que dans viewDidAppear tout est terminé.

42
tttthomasssss

J'ai aussi ce problème. J'ai trouvé deux solutions à ce problème:

  1. Vous pouvez voir cette solution ci-dessus.
  2. J'ai trouvé la sous-classe de UINavigationController où ce problème a été résolu. Contrôleur de navigation en mémoire tampon
21
Igor_CodabraSoft

Vous devriez 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];
        });
15
prohuutuan

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

1) Vous n’utilisez pas UIViewController's initialiseur désigné initWithNibName:bundle:. Essayez de l’utiliser au lieu de init.

2) définissez animated:YES sur NO, et cela résout le problème . [self.navigationController pushViewController: viewController_Obj animated:NO];

12
kunalg

Assurez-vous de ne pas oublier dans -viewWillAppear, -viewDidAppear, -viewDidLoad, -viewWillDisappear, -viewDidDisappear d'appeler la super-méthode appropriée dans la surcharge de ces méthodes .

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

remarquez que apparaît et disparaît les méthodes sont ne correspondent pas

7
Nikolay Shubenkov

J'ai eu le même problème en utilisant le contrôleur de navigation et y pousser d'autres contrôleurs . J'ai essayé d'utiliser Contrôleur de navigation en mémoire tampon et plusieurs autres approches, mais cela n'a pas fonctionné pour moi. Après avoir passé un peu de temps à le comprendre, j'ai remarqué que ce problème se produisait si vous essayiez de pousser un nouveau contrôleur de vue alors qu'une transaction (animation) précédente était en cours (environ 0,5 seconde, je suppose). Quoi qu’il en soit, j’ai trouvé une solution rapide en déléguant le contrôleur de navigation et en attendant la fin de l’animation précédente.

7
dimanitm

Motif du message: Ce message s’affiche si et seulement 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.

Manière de supprimer le message d'erreur: Déplacez votre code push/present vers la méthode viewDidAppear pour résoudre le problème.

2
Mehul Thakkar

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

Indique qu'une animation est démarrée avant que la dernière animation associée ne soit pas terminée. Alors, ouvrez-vous un contrôleur de vue avant d’appuyer sur le nouveau? Ou peut être popping à la racine? Si oui, essayez de le faire sans animation, c'est-à-dire [self.navigationController popToRootViewControllerAnimated:NO];

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

2
infiniteLoop

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

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

[Problème]

Contrôleur de navigation -> VC1 - Push -> VC2 - PopOver ou Modal Segue -> VC3.

VC3 est en train de revenir à VC1.

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

Si la séquence de VC à VC est Push, l'avertissement est terminé.

[Solution]

Ce serait formidable si la logique de déroulement prendrait soin de cela. Peut-être que c'est un bug, peut-être pas. Quoi qu'il en soit, la solution consiste à faire de VC2 (le contrôleur qui affiche la fenêtre contextuelle) la cible du rembobinage, puis d'attendre qu'il ait fini de s'afficher avant d'afficher le contrôleur de navigation. Cela garantit que l'animation de rembobinage (contextuel inversé) a suffisamment de temps pour se terminer avant de reculer davantage. Même avec les animations désactivées, il faut encore attendre ou sinon vous obtenez l'erreur.

Votre code pour VC2 devrait être comme suit. (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)
        }
    }
}
2
Carter Medlin

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

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

En gros, cela signifie que le cycle de vie d'une vue n'est pas rationalisé pour les viewControllers que vous essayez d'afficher à ce moment-là.

1
elliotrock

Pour ce que ça vaut, j'ai eu la même erreur quand on n'inclut pas un appel à [super viewDidLoad:animated] dans mon viewDidLoad override.

1
raeldor

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
BabyPanda

J'ai aussi eu ça à

[self dismissModalViewControllerAnimated:YES];

J'ai changé la YES en une NO et cela a résolu le problème.

1
DD.amor

J'ai également eu ce problème lorsque j'ai tapé sur un bouton d'un NIB. Il s’avère que j’ai accidentellement activé le bouton pour envoyer un événement à deux méthodes IBAction, chacune effectuant un pushViewController: animé:

1
Martin Lockett

J'avais une logique implémentée pour attendre en poussant la UIViewController jusqu'à ce que toutes les données aient été téléchargées. Il y avait une erreur dans cette logique qui a poussé à pousser la UIViewController trop tôt alors qu'un autre appel d'API était en cours.

Cela a poussé la même UIViewController à être poussée deux fois par la UINavigationController et a donné cet avertissement.

1
Jasper

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

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

j'ai le même problème quand j'utilisais la méthode pop de navigationcontrollerIn mon application, j'utilise une logique distincte pour le contrôleur de navigation, évitant ainsi 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 de retour et ses événements. les observateurs de notification sont enregistrés et ne sont pas supprimés. Ainsi, la notification est déclenchée deux fois et crée l'erreur susmentionnée. Vérifiez votre code à fond pour obtenir de tels défauts

1
Dileep stanley

Dans mon cas, je récupérais NSData à partir de NSURL dans la méthode 'viewDidLoad'. 

0
BhushanVU

J'ai eu ce problème quand j'ai oublié de mettre en pause; après avoir poussé la vue dans une déclaration de commutateur!

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
Alex McPherson

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
user3390994

Vous pouvez le rencontrer si vous essayez de renvoyer un UIViewController avant la fin du chargement.

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 le UIViewController que je présentais se congédiait parce que l'utilisateur n'était pas connecté à son compte.

J'espère que ça aide quelqu'un.

0
Mark Hennings

la raison derrière l'erreur "Appels non équilibrés pour commencer/terminer les transitions d'apparence" est lorsque vous naviguez | segue deux fois en même temps 

0
poa

Ce fut un dur pour moi: J'ai dépassé 

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

sans imposer:

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

dans mon contrôleur de navigation racine de la fenêtre . puis un contrôleur de navigation enfant s'est plaint en poussant un autre contrôleur de vue avec l'avertissement susmentionné. L’avertissement n’était pas le pire, Le gros problème était que le délégué du contrôleur de navigation pour enfant n’était plus appelé.

0
heiko

Swift 4

Mon problème était que je présentais un autre VC avant la fin du rendu de mon actuel. 

La solution a été de présenter mon prochain VC après un court délai. 

CE QUE VOUS NE DEVEZ 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)
}
0
Ugo Marinelli