Ich habe SO über einen anderen Benutzer gelesen, bei dem ein ähnlicher Fehler aufgetreten ist , aber dieser Fehler tritt in einem anderen Fall auf.
Ich habe diese Nachricht erhalten, als ich anfänglich einen View Controller hinzugefügt habe:
Unbalanced calls to begin/end appearance transitions for
<UITabBarController: 0x197870>
Die Struktur der App ist wie folgt:
Ich habe einen TabBarController mit 5 Registerkarten, der mit 5 View Controllern verknüpft ist. Auf der Registerkarte "Erste Anzeige" rufe ich einen neuen View Controller zum Überlagern als Einführung in die App auf.
Ich benutze diesen Code, um den Einführungsansichts-Controller aufzurufen:
IntroVC *vc = [[IntroVC alloc] init];
[self presentModalViewController:vc animated:YES];
[vc release];
Nachdem dieser IntroVC
Ansichts-Controller angezeigt wurde, wird der obige Fehler angezeigt.
ps Ich verwende xCode 4.2 und iOS 5.0 SDK und entwickle die iOS 4.3 App.
ios
ios4
uitabbarcontroller
Raubvogel
quelle
quelle
Antworten:
Ohne mehr von dem umgebenden Code zu sehen, kann ich keine eindeutige Antwort geben, aber ich habe zwei Theorien.
Sie verwenden nicht
UIViewController
den vorgesehenen InitialisiererinitWithNibName:bundle:
. Versuchen Sie es statt nurinit
.Auch
self
kann eine der Registerkarte Ansicht - Controller in der Bar - Controller. Präsentieren Sie View Controller immer vom obersten View Controller aus. In diesem Fall bitten Sie den Registerkarten-Controller, den Overlay View Controller im Namen des View Controllers zu präsentieren. Sie können weiterhin alle Rückrufdelegierten für den Real View Controller behalten, aber Sie müssen den Registerkarten-Controller vorhanden haben und schließen.quelle
Ich habe diesen Fehler behoben, indem ich die Animation von JA auf NEIN geändert habe.
Von:
Zu:
quelle
Wie von danh gepostet
Sie können diese Warnung generieren, indem Sie die modale VC vor der Initialisierung der App anzeigen. dh Starten Sie eine Anwendungsvorlagen-App mit Registerkarten und präsentieren Sie eine modale VC über self.tabBarController als letzte Zeile in der Anwendung: didFinishLaunching. Warnung erscheint. Lösung: Lassen Sie den Stapel zuerst abwickeln und präsentieren Sie das modale VC in einer anderen Methode, die mit einem performSelector withDelay: 0.0 aufgerufen wird
Versuchen Sie, die Methode in viewWillAppear zu verschieben und zu schützen, damit sie nur einmal ausgeführt wird (würde empfehlen, eine Eigenschaft einzurichten).
quelle
viewWillAppear
und nichtviewDidAppear
?Eine andere Lösung für viele Fälle besteht darin, sicherzustellen, dass der Übergang zwischen
UIViewController
s nach Abschluss des nicht geeigneten Verfahrens (wie während der Initialisierung) erfolgt, indem Folgendes ausgeführt wird:Dies gilt auch für
pushViewController:animated:
usw.quelle
Ich hatte das gleiche Problem. Ich habe eine Methode
viewDidLoad
in meinem ersten aufgerufenUIViewController
Innerhalb der Sekunde habe
UIViewController
ich das auch mit 0,5 Sekunden Verzögerung gemacht. Nachdem die Verzögerung auf einen höheren Wert geändert wurde, funktionierte sie einwandfrei. Es ist, als ob der Segue nach einem anderen Segue nicht zu schnell durchgeführt werden kann.quelle
viewDidAppear
damit derUINavigationController
bereit ist, damit umzugehen. Ich habe meinen Beitrag in diesen geändert;)Ich hatte das gleiche Problem, als ich meinen Login View Controller von einem anderen View Controller aus präsentieren musste. Wenn der Benutzer nicht autorisiert ist, habe ich dies in der ViewDidLoad-Methode meines anderen View Controllers getan (falls nicht autorisiert -> presentModalViewController). Als ich anfing, es in der ViewDidAppear-Methode zu erstellen, habe ich dieses Problem gelöst. Ich denke, dass ViewDidLoad nur Eigenschaften initialisiert und danach der eigentliche Algorithmus für die Anzeige beginnt! Deshalb müssen Sie die viewDidAppear-Methode verwenden, um modale Übergänge vorzunehmen!
quelle
Ich hatte dieses Problem wegen eines Tippfehlers:
anstatt
Es wurde "WillAppear" im Super anstelle von "DidAppear" genannt.
quelle
Ich hatte viele Probleme mit dem gleichen Problem. Ich habe dieses Problem gelöst
Intro *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"introVC"];
[self.tabBarController presentModalViewController : vc animated:YES];
Ich habe den Viewcontroller in meinem Storyboard, aus irgendeinem Grund hat die Verwendung von only
[[introvc alloc] init];
bei mir nicht funktioniert.quelle
Ich habe es durch Schreiben gelöst
quelle
Ich hatte dieses Problem mit einem Code eines Drittanbieters. Jemand hat vergessen, das Super-Inside von viewWillAppear und viewWillDisappear in einer benutzerdefinierten TabBarController-Klasse festzulegen.
quelle
Wenn Sie verwenden
transitioningDelegate
(im Beispiel dieser Frage nicht der Fall), setzen Sie ebenfallsmodalPresentationStyle
auf.Custom
.Schnell
quelle
Ich hatte den gleichen Fehler. Ich habe eine Registerkartenleiste mit 3 Elementen und habe unbewusst versucht, den Root-View-Controller von Element 1 in Element 2 meiner Registerkartenleiste mit aufzurufen
performSegueWithIdentifier
.Was passiert ist, dass es den View Controller aufruft und nach einigen Sekunden zum Root View Controller von Element 2 zurückkehrt und diesen Fehler protokolliert.
Anscheinend können Sie den Root-View-Controller eines Elements nicht zu einem anderen Element aufrufen.
Also statt
performSegueWithIdentifier
ich benutzte
[self.parentViewController.tabBarController setSelectedIndex:0];
Hoffe das hilft jemandem.
quelle
Ich hatte das gleiche Problem und dachte, ich würde posten, falls jemand anderes auf etwas Ähnliches stößt.
In meinem Fall hatte ich meinem UITableViewController eine lange Gestenerkennung hinzugefügt.
In meinem onLongPress-Selektor habe ich meinen nächsten View Controller gestartet.
In meinem Fall habe ich die Fehlermeldung erhalten, weil der Langdruckerkenner mehr als einmal ausgelöst wurde und mein "SomeViewController" daher mehrmals auf den Stapel geschoben wurde.
Die Lösung bestand darin, einen Booleschen Wert hinzuzufügen, um anzuzeigen, wann der SomeViewController auf den Stapel verschoben wurde. Als die viewWillAppear-Methode meines UITableViewController aufgerufen wurde, habe ich den Booleschen Wert auf NO zurückgesetzt.
quelle
Ich habe festgestellt, dass Sie, wenn Sie ein Storyboard verwenden, den Code, der den neuen Ansichts-Controller darstellt, in viewDidAppear einfügen möchten. Außerdem wird die Warnung "Das Anzeigen von Ansichts-Controllern auf getrennten Ansichts-Controllern wird nicht empfohlen" entfernt.
quelle
In Swift 2+ funktioniert für mich:
Ich habe UITabBarViewController im Storyboard und ich hatte die Eigenschaft Index wie folgt ausgewählt:
Aber ich lösche es und füge meine viewDidLoad-Methode meiner ursprünglichen Klasse wie folgt hinzu:
Ich hoffe ich kann jemandem helfen.
quelle
Eigentlich müssen Sie warten, bis die Push-Animation endet. So können Sie UINavigationController delegieren und das Drücken verhindern, bis die Animation endet.
quelle
Wie @danh vorschlug, bestand mein Problem darin, dass ich das modale VC vor dem Start präsentierte
UITabBarController
. Es war mir jedoch unangenehm, mich auf eine feste Verzögerung zu verlassen, bevor ich den View Controller präsentierte (nach meinen Tests musste ich eine Verzögerung von 0,05 bis 0,1 Sekunden verwendenperformSelector:withDelay:
). Meine Lösung besteht darin, einen Block hinzuzufügen, der fürUITabBarController
dieviewDidAppear:
Methode aufgerufen wird:PRTabBarController.h:
PRTabBarController.m:
Jetzt in
application:didFinishLaunchingWithOptions:
quelle
Sie müssen sicherstellen, dass - (void) beginAppearanceTransition: (BOOL) animiert erscheint: (BOOL) animiert und - (void) endAppearanceTransition gemeinsam in der Klasse erstellt wird.
quelle
Ich hatte das gleiche Problem. Bei der Entwicklung wollte ich Bildschirme umgehen. Ich habe in viewDidLoad von einem Ansichts-Controller zu einem anderen navigiert, indem ich eine Auswahlmethode aufgerufen habe.
Das Problem ist, dass wir den ViewController den Übergang beenden lassen sollten, bevor wir zu einem anderen ViewController wechseln.
quelle
Swift 5
quelle
Ich hatte dieses Problem, als ich von Root-TVC zu TVC A und dann zu TVC B navigiert war. Nachdem ich in TVC BI auf die Schaltfläche "Laden" geklickt hatte, wollte ich direkt zum Root-TVC zurückspringen (TVC A muss nicht erneut besucht werden. Warum also?) . Ich hatte:
... was den Fehler "Unausgeglichene Anrufe zum Starten / Beenden usw." ergab. Folgendes hat den Fehler behoben, aber keine Animation:
Dies war meine endgültige Lösung, kein Fehler und immer noch animiert:
quelle
Ich bin auf diesen Fehler gestoßen, als ich einen UIButton an eine Storyboard-Segue-Aktion (in IB) angeschlossen habe, aber später beschlossen habe, die Schaltfläche programmgesteuert aufzurufen
performSegueWithIdentifier
zu lassen, um zu vergessen, den ersten aus IB zu entfernen.Im Wesentlichen hat es den Segue-Aufruf zweimal ausgeführt, diesen Fehler ausgegeben und meine Ansicht tatsächlich zweimal verschoben. Die Lösung bestand darin, einen der Segue-Aufrufe zu entfernen.
Hoffe das hilft jemandem so müde wie mir!
quelle