J'ai lu SO au sujet d'un autre utilisateur rencontrant une erreur similaire , mais cette erreur est dans un cas différent.
J'ai reçu ce message lorsque j'ai initialement ajouté un contrôleur de vue:
Unbalanced calls to begin/end appearance transitions for
<UITabBarController: 0x197870>
La structure de l'application est la suivante:
J'ai un TabBarController à 5 onglets lié à 5 contrôleurs de vue. Dans l'onglet d'affichage initial, j'appelle un nouveau contrôleur de vue à superposer en tant qu'introduction de l'application.
J'utilise ce code pour appeler le contrôleur de vue d'introduction:
IntroVC *vc = [[IntroVC alloc] init];
[self presentModalViewController:vc animated:YES];
[vc release];
Une fois que ce IntroVC
contrôleur de vue apparaît, l'erreur ci-dessus s'affiche.
ps J'utilise le SDK xCode 4.2 et iOS 5.0 pour développer l'application iOS 4.3.
ios
ios4
uitabbarcontroller
Raptor
la source
la source
Réponses:
Sans voir davantage le code environnant, je ne peux pas donner de réponse définitive, mais j'ai deux théories.
Vous n'utilisez
UIViewController
est désigné initialiseurinitWithNibName:bundle:
. Essayez de l'utiliser au lieu de simplementinit
.En outre,
self
peut être l' un des contrôleurs de vue de la barre onglet contrôleur. Présentez toujours les contrôleurs de vue depuis le contrôleur de vue le plus haut, ce qui signifie que dans ce cas, demandez au contrôleur de la barre d'onglets de présenter le contrôleur de vue de superposition au nom du contrôleur de vue. Vous pouvez toujours conserver les délégués de rappel vers le contrôleur de vue réel, mais vous devez avoir le contrôleur de la barre d'onglets présent et le fermer.la source
J'ai corrigé cette erreur en changeant l'animation de OUI à NON.
De:
À:
la source
Publié par danh
Vous pouvez générer cet avertissement en présentant le vc modal avant que l'application ne soit initialisée. par exemple, démarrez une application de modèle d'application à onglets et présentez un vc modal au-dessus de self.tabBarController comme dernière ligne de l'application: didFinishLaunching. L'avertissement apparaît. Solution: laissez la pile se dérouler en premier, présentez le vc modal dans une autre méthode, appelée avec un performSelector withDelay: 0.0
Essayez de déplacer la méthode dans viewWillAppear et gardez-la pour qu'elle ne soit exécutée qu'une seule fois (nous vous recommandons de configurer une propriété)
la source
viewWillAppear
et pasviewDidAppear
?Une autre solution dans de nombreux cas est de s'assurer que la transition entre
UIViewController
s se produit après la fin de la procédure non appropriée (comme lors de l'initialisation), en faisant:Ceci est général pour aussi
pushViewController:animated:
, etc.la source
J'ai eu le même problème. J'ai appelé une méthode à l'
viewDidLoad
intérieur de mon premierUIViewController
Dans le second,
UIViewController
j'ai fait la même chose avec un retard de 0,5 seconde. Après avoir changé le délai à une valeur plus élevée, cela a bien fonctionné. C'est comme si la séquence ne pouvait pas être effectuée trop vite après une autre séquence.la source
viewDidAppear
pour que leUINavigationController
soit prêt à le gérer. J'ai changé mon message pour ceci;)J'ai eu le même problème lorsque je devais présenter mon contrôleur de vue de connexion à partir d'un autre contrôleur de vue.Si l'utilisateur n'est pas autorisé, je l'ai fait dans la méthode ViewDidLoad de mon autre contrôleur de vue (s'il n'est pas autorisé -> presentModalViewController). Quand je commence à le faire dans la méthode ViewDidAppear, j'ai résolu ce problème. Je pense que ViewDidLoad n'initialise que les propriétés et après cela, l'algorithme d'affichage réel commence! C'est pourquoi vous devez utiliser la méthode viewDidAppear pour effectuer des transitions modales!
la source
J'ai eu ce problème à cause d'une faute de frappe:
au lieu de
Il appelait "WillAppear" dans le super au lieu de "DidAppear"
la source
J'ai eu beaucoup de problèmes avec le même problème. J'ai résolu celui-ci en
Intro *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"introVC"];
[self.tabBarController presentModalViewController : vc animated:YES];
J'ai le viewcontroller dans mon storyboard, pour une raison quelconque, utiliser uniquement
[[introvc alloc] init];
ne fonctionnait pas pour moi.la source
Je l'ai résolu en écrivant
la source
J'ai eu ce problème avec un code tiers. Quelqu'un a oublié de définir le super intérieur de viewWillAppear et viewWillDisappear dans une classe TabBarController personnalisée.
la source
Si vous utilisez
transitioningDelegate
(ce n'est pas le cas dans l'exemple de cette question), définissez égalementmodalPresentationStyle
sur.Custom
.Rapide
la source
J'ai eu la même erreur. J'ai une barre d'onglets avec 3 éléments et j'essayais inconsciemment d'appeler le contrôleur de vue racine de l'élément 1 dans l'élément 2 de ma barre d'onglets en utilisant
performSegueWithIdentifier
.Ce qui se passe, c'est qu'il appelle le contrôleur de vue et retourne au contrôleur de vue racine de l'élément 2 après quelques secondes et enregistre cette erreur.
Apparemment, vous ne pouvez pas appeler le contrôleur de vue racine d'un élément vers un autre élément.
Donc au lieu de
performSegueWithIdentifier
j'ai utilisé
[self.parentViewController.tabBarController setSelectedIndex:0];
J'espère que cela aide quelqu'un.
la source
J'ai eu le même problème et j'ai pensé que je publierais au cas où quelqu'un d'autre rencontrerait quelque chose de similaire.
Dans mon cas, j'avais attaché un outil de reconnaissance de geste de pression longue à mon UITableViewController.
Dans mon sélecteur onLongPress, j'ai lancé mon prochain contrôleur de vue.
Dans mon cas, j'ai reçu le message d'erreur parce que le module de reconnaissance de pression longue s'est déclenché plus d'une fois et, par conséquent, mon "SomeViewController" a été poussé plusieurs fois sur la pile.
La solution était d'ajouter un booléen pour indiquer quand le SomeViewController avait été poussé sur la pile. Lorsque la méthode viewWillAppear de mon UITableViewController a été appelée, j'ai remis le booléen à NO.
la source
J'ai trouvé que, si vous utilisez un storyboard, vous voudrez mettre le code qui présente le nouveau contrôleur de vue dans viewDidAppear. Il supprimera également l'avertissement «La présentation de contrôleurs de vue sur des contrôleurs de vue détachés est déconseillée».
la source
Dans Swift 2+ pour moi fonctionne:
J'ai UITabBarViewController dans le storyboard et j'avais sélectionné la propriété d'Index comme ceci:
Mais je le supprime et ajoute dans ma méthode viewDidLoad de ma classe initiale, comme ceci:
J'espère que je peux aider quelqu'un.
la source
En fait, vous devez attendre la fin de l'animation push. Ainsi, vous pouvez déléguer UINavigationController et empêcher de pousser jusqu'à la fin de l'animation.
la source
Comme @danh l'a suggéré, mon problème était que je présentais le vc modal avant que le ne
UITabBarController
soit prêt. Cependant, je me sentais mal à l'aise de compter sur un délai fixe avant de présenter le contrôleur de vue (à partir de mes tests, j'avais besoin d'utiliser un délai de 0,05-0,1 sperformSelector:withDelay:
). Ma solution est d'ajouter un bloc qui est appelé surUITabBarController
laviewDidAppear:
méthode de:PRTabBarController.h:
PRTabBarController.m:
Maintenant en
application:didFinishLaunchingWithOptions:
la source
vous devez vous assurer que - (void) beginAppearanceTransition: (BOOL) isAppearing animated: (BOOL) animated et - (void) endAppearanceTransition est créé ensemble dans la classe.
la source
J'ai eu le même problème. Lors du développement, je voulais contourner les écrans. Je naviguais d'un contrôleur de vue à un autre dans viewDidLoad en appelant une méthode de sélection.
Le problème est que nous devons laisser le ViewController terminer la transition avant de passer à un autre ViewController.
la source
Swift 5
la source
J'ai eu ce problème lorsque j'avais navigué de la racine TVC à TVC A puis à TVC B.Après avoir appuyé sur le bouton "charger" dans TVC BI voulait revenir directement à la racine TVC (pas besoin de revoir TVC A alors pourquoi le faire) . J'ai eu:
... qui a donné l'erreur "Appels déséquilibrés pour commencer / terminer etc". Ce qui suit a corrigé l'erreur, mais aucune animation:
C'était ma solution finale, sans erreur et toujours animée:
la source
J'ai rencontré cette erreur lorsque j'ai accroché un UIButton à une action de segue de storyboard (dans IB) mais j'ai ensuite décidé que le bouton appelle par programme en
performSegueWithIdentifier
oubliant de supprimer le premier d'IB.Essentiellement, il a effectué l'appel de segue deux fois, a donné cette erreur et a en fait poussé mon point de vue deux fois. Le correctif consistait à supprimer l'un des appels de segue.
J'espère que cela aide quelqu'un d'aussi fatigué que moi!
la source