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?
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?
Réponses:
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.
Dans mon cas, cela s'est produit lorsque j'ai déclenché [self performSegueWithIdentifier:@"SomeIdentifier" sender:self];
dans UINavigationController
la viewDidLoad
méthode d' un élément .
Le déplacer dans la viewDidAppear
méthode a résolu le problème.
La raison est très probable que dans viewDidLoad
toutes les animations de fantaisie ne sont pas déjà terminées, alors que viewDidAppear
tout est fait.
J'ai aussi ce problème. J'ai trouvé deux solutions à ce problème:
UINavigationController
laquelle ce problème a été résolu. Contrôleur de navigation tamponné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];
});
dispatch_async
file d'attente principale. Le problème dispatch_async
est 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];});
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's
initialiseur désigné initWithNibName:bundle:
. Essayez de l'utiliser au lieu de simplementinit
.
2) réglé animated:YES
sur NON, et cela a résolu le problème. par exemple.[self.navigationController pushViewController: viewController_Obj animated:NO];
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.
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
super.viewWillAppear()
intérieur viewDidDisappear()
.
"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.
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;
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)
}
}
}
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.
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
Pour ce que ça vaut, j'ai eu cette même erreur en n'incluant pas un appel à [super viewDidLoad:animated]
dans mon viewDidLoad
remplacement.
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:
J'ai mis en place une logique pour attendre en poussant le UIViewController
jusqu'à 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 UIViewController
deux fois par le UINavigationController
et a donné cet avertissement.
Cause du message: Ce message ne sera pas affiché si et seulement si vous poussez / présenter un autre contrôleur Vue viewWillAppear
, loadView
, init
ou viewDidLoad
méthode de régulateur de courant Voir
viewDidAppear
Mé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
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)
}
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:
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 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.
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.