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é?
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 viewWillAppear
cellSelected = 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.
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é.
J'ai aussi ce problème. J'ai trouvé deux solutions à ce problème:
UINavigationController
où ce problème a été résolu. Contrôleur de navigation en mémoire tamponVous 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];
});
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];
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
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.
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.
'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.
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)
}
}
}
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à.
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.
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
J'ai aussi eu ça à
[self dismissModalViewControllerAnimated:YES];
J'ai changé la YES
en une NO
et cela a résolu le problème.
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é:
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.
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;
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
Dans mon cas, je récupérais NSData
à partir de NSURL
dans la méthode 'viewDidLoad
'.
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:
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];
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.
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
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é.
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)
}