Unausgeglichene Aufrufe zum Beginnen / Beenden von Erscheinungsübergängen für <FirstViewController: 0x2a2c00>

93

Ich habe dieses Problem, wenn ich meine App simuliere. Es ist kein Fehler oder eine Warnung, aber es wird in meiner Konsole angezeigt. Hat dies jemals jemand erlebt?

C. Johns
quelle
Machst du eine Art Animation in diesem View Controller?
1
Ja. Ich habe eine Eröffnungsanimation, die zu Bildern auseinander gleitet. Ich habe jetzt festgestellt, dass dieser Fehler nur auftritt, wenn ich Code auf das Telefon lade.
C. Johns
Die Fehlermeldung schlägt vor, dass Sie einen Übergang beginnen, aber die entsprechende Endmethode fehlt.
1
Habe das gleiche. Irgendeine Lösung dafür?
Seeafish
Auch auf der Suche nach einer Lösung für dieses
Problem

Antworten:

48

In meinem Fall tritt dieser Fehler auf, wenn Sie in einer Tabellenansicht sehr schnell auf zwei Registerkarten klicken.

Das Ergebnis führt zu einem falschen Titelnamen. Die Schaltfläche "Zurück" verschwindet. Jemand erwähnte das, wenn Sie eine Ansicht drücken , set animated:NO. Der Fehler verschwindet, verursacht aber immer noch ein seltsames Verhalten. Es werden zwei Ansichten verschoben, dann müssen Sie zweimal zurücksetzen, um zum Tabellenansichtsbildschirm zurückzukehren.

Methode, die ich versucht habe, um dieses Problem zu lösen:

hinzufügen BOOL cellSelected;

im viewWillAppear cellSelected = YES;

in didselectcell delegate if (cellSelected){cellSelected = NO; do action ; }

Dies verhindert, dass zwei verschiedene Zellen sehr schnell angeklickt werden.

chings228
quelle
5
Ich vermute, einige der Formulierungen waren schwer zu verstehen. Ich habe einige Änderungen vorgenommen, um die Lesbarkeit zu verbessern.
Kyle Clegg
42

In meinem Fall ist es passiert, als ich [self performSegueWithIdentifier:@"SomeIdentifier" sender:self];innerhalb UINavigationControllerder viewDidLoadMethode eines Elements ausgelöst habe .

Das Verschieben in die viewDidAppearMethode löste das Problem.

Der Grund ist sehr wahrscheinlich, dass viewDidLoadnicht alle ausgefallenen Animationen bereits fertig sind, während in viewDidAppearallem alles erledigt ist.

tttthomasssss
quelle
Vielen Dank. Ich hatte mich in der Höhlenmenschen-Ära verlaufen, in der ich jedes einzelne UI-Element durch Code erstellte. Storyboard-Sachen sind neu für mich.
Kiran Kulkarni
21

Ich habe auch dieses Problem. Ich habe zwei Lösungen für dieses Problem gefunden:

  1. Sie können diese Lösung oben sehen.
  2. Ich habe eine Unterklasse gefunden, UINavigationControllerin der dieses Problem behoben wurde. Gepufferter Navigationscontroller
Igor_CodabraSoft
quelle
15

Sie sollten Ihren Code in einer anderen Schleife ausführen, um dies zu vermeiden

 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];
        });
Prohuutuan
quelle
7
Eine bessere Idee ist es, die präsentierende Animation in eine dispatch_asyncHauptwarteschlange einzuschließen . Die Sache dispatch_asyncist, dass es wartet, bis alle anderen Animationen in der Hauptwarteschlange fertig sind. Es ist viel besser als eine Verzögerung zu verwenden, weil: 1- Sie nie wissen, ob eine Verzögerung ausreicht, es hängt von Ihrem Host-Gerät ab 2- Sie werden die Verzögerung übertreiben und etwas wird verzögern. versuchen Sie dies:dispatch_async(dispatch_get_main_queue(), ^{[self presentViewController:self.yourModalVC animated:YES completion:nil];});
M. Porooshani
12

Ich hatte viele Probleme mit dem gleichen Problem. Ich habe das auf diese Weise gelöst

1) Sie verwenden keinen UIViewController'sbestimmten Initialisierer initWithNibName:bundle:. Versuchen Sie es statt nur init.

2) animated:YESauf NEIN setzen, und das hat das Problem gelöst. z.B.[self.navigationController pushViewController: viewController_Obj animated:NO];

Kunalg
quelle
7

Ich hatte das gleiche Problem mit dem Navigations-Controller und schob andere Controller darauf. Ich habe versucht, Buffered Navigation Controller und verschiedene andere Ansätze zu verwenden, aber es hat bei mir nicht funktioniert. Nachdem ich einige Zeit damit verbracht hatte, es herauszufinden, bemerkte ich, dass dieses Problem auftritt, wenn Sie versuchen, einen neuen Ansichts-Controller zu drücken, während die vorherige Transaktion (Animation) ausgeführt wird (ungefähr 0,5 Sekunden Dauer, denke ich). Wie auch immer, ich habe eine schnelle Lösung gefunden, indem ich den Navigationscontroller delegiert und auf das Ende der vorherigen Animation gewartet habe.

Dimanitm
quelle
Danke dir! Das Verschieben meiner Logik auf viewDidAppear hat in meiner Situation geholfen.
Jaroslav
7

Stellen Sie sicher, dass Sie nicht vergessen, in -viewWillAppear, -viewDidAppear, -viewDidLoad, -viewWillDisappear, -viewDidDisappear die richtige Supermethode für Ihre Überladung dieser Methoden aufzurufen. In meinem Fall stimmte der Methodenname beispielsweise nicht wie folgt überein:

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

Beachten Sie, dass die Methoden zum Anzeigen und Verschwinden nicht übereinstimmen

Nikolay Shubenkov
quelle
Ich habe gerade zwei Stunden damit verbracht, dieses Problem zu debuggen, und es stellte sich heraus, dass es so war. super.viewWillAppear()Innerhalb anrufen viewDidDisappear().
Daniel Wood
Danke für diesen Tipp. Es war nicht mein einziges Problem, aber es hat geholfen!
Anthony C
4

'Unausgeglichene Aufrufe zum Beginnen / Beenden von Erscheinungsübergängen für'

Sagt, dass eine Animation gestartet wird, bevor die letzte verwandte Animation nicht fertig ist. Lassen Sie also einen View-Controller platzen, bevor Sie den neuen drücken? Oder knallt es vielleicht zur Wurzel? Wenn ja, versuchen Sie dies ohne Animation[self.navigationController popToRootViewControllerAnimated:NO];

Und sehen Sie, ob dies das Problem behebt. In meinem Fall hat dies den Trick getan.

Endlosschleife
quelle
1
Dies ist der Schlüssel: Popup oder Änderung anderer Viewcontroller-Übergänge gleichzeitig.
Rocky
2

Ich habe dieses Problem erhalten, weil ich einen UIPrintInteractionController von einem viewController ohne UITabbar und weder von UINavigationBar aufgerufen habe. Es scheint, dass der UIPrintInteractionController nicht den richtigen printInteractionControllerParentViewController erhalten hat. Das Implementieren der Methode im Delegaten und das Zurückgeben des aktuellen rootViewControllers hat für mich funktioniert.

    - (UIViewController*)printInteractionControllerParentViewController:(UIPrintInteractionController*)printInteractionController;
Balooka
quelle
2

Ich hatte ein ähnliches Problem, bei dem modale Dialoge zurückgespult wurden. Postete die Lösung hier ...

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

[Problem]

Nav Controller -> VC1 -Push -> VC2 -PopOver oder Modal Segue -> VC3.

VC3 wird auf VC1 zurückgespult.

Wenn der Übergang von VC2 zu VC3 PopOver und Modal ist, endet das Abwickeln mit einer Warnung: Unausgeglichene Aufrufe zum Beginnen / Beenden von Erscheinungsübergängen für UIViewController "

Wenn der Übergang von VC zu VC gedrückt wird, ist die Warnung weg.

[Lösung]

Es wäre großartig, wenn sich die Abwicklungslogik darum kümmern würde. Vielleicht ist es ein Fehler, vielleicht auch nicht. In beiden Fällen besteht die Lösung darin, VC2 (den Controller mit dem Popup) zum Ziel des Rücklaufs zu machen und dann zu warten, bis es vollständig angezeigt wird, bevor Sie den Navigationscontroller öffnen. Dadurch wird sichergestellt, dass die Animation zum Zurückspulen (umgekehrtes Popup) genügend Zeit hat, um fertig zu werden, bevor Sie weiter zurückgehen. Selbst wenn die Animationen deaktiviert sind, muss es noch warten, sonst wird der Fehler angezeigt.

Ihr Code für VC2 sollte wie folgt lauten. (Schnell)

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)
        }
    }
}
Carter Medlin
quelle
1

Die Situation kann auftreten, wenn Sie eine Ansicht mit einem modalen Ansichtscontroller als Unteransicht hinzufügen. Am besten zu verwenden:

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

Grundsätzlich heißt es, dass der Ansichtslebenszyklus für die Ansichtscontroller, die Sie dann anzeigen möchten, nicht optimiert ist.

Elliotrock
quelle
1

Ich habe das gleiche Problem, wenn ich versuche:

[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:2] animated:YES];

in einer Funktion wie - (void) popUpToLevelTwo;, und ein return;am Ende der Funktion zu setzen, löst das Problem

BabyPanda
quelle
1

Ich habe das auch bei

[self dismissModalViewControllerAnimated:YES];

Ich habe das YESin a geändert NO, und das hat das Problem gelöst.

DD.amor
quelle
1

Ich habe das gleiche Problem, wenn ich die Pop-Methode des Navigationscontrollers verwendet habe. In meiner App verwende ich eine separate Logik für den Navigationscontroller. So wurde die Verwendung der Navigationsleiste vermieden und sie ist immer versteckt. Dann benutze ich eine benutzerdefinierte Ansicht und Benachrichtigung für die Behandlung der Backbutton und seiner Ereignisse. Benachrichtigungsbeobachter werden registriert und nicht entfernt. Die Benachrichtigung wird also zweimal ausgelöst und erzeugt den oben genannten Fehler. Überprüfen Sie Ihren Code gründlich, um solche Fehler zu erhalten

Dileep Stanley
quelle
1

Für das, was es wert ist, habe ich den gleichen Fehler erhalten, wenn ich keinen Aufruf von [super viewDidLoad:animated]in meine viewDidLoadÜberschreibung aufgenommen habe.

Raeldor
quelle
1
du meinst vielleicht viewDidAppear? viewDidLoad hat keine Parameter
Fabio Napodano
1

Ich hatte auch dieses Problem, als ich auf eine Schaltfläche einer NIB tippte. Es stellte sich heraus, dass ich versehentlich die Schaltfläche verdrahtet hatte, um ein Ereignis an zwei IBAction-Methoden zu senden, von denen jede einen pushViewController ausführte: animiert:

Martin Lockett
quelle
Vielen Dank !! Du sparst meine Zeit !!
VD
1

Ich hatte eine Logik implementiert, um zu warten, UIViewControllerbis alle Daten heruntergeladen wurden. Es gab einen Fehler in dieser Logik, der dazu führte, dass das UIViewControllerzu früh gepusht wurde, während noch ein weiterer API-Aufruf ausgeführt wurde.

Es bewirkte, dass das gleiche UIViewControllerzweimal von der gedrückt wurde UINavigationControllerund gab diese Warnung.

Jaspis
quelle
1

Grund für Meldung: Diese Meldung wenn bekommen angezeigt und nur , wenn Sie drängen / präsentieren eine andere View - Controller aus viewWillAppear, loadView, initoder viewDidLoadMethode der aktuellen View - Controller

So entfernen Sie Fehlermeldungen: Verschieben Sie Ihren Push- / Präsentationscode in die viewDidAppearMethode, um das Problem zu beheben

Mehul Thakkar
quelle
1

Swift 4

Mein Problem war, dass ich eine andere VC präsentierte, bevor meine aktuelle fertig gerendert wurde.

Die Lösung bestand darin, mein nächstes VC nach einer kurzen Verzögerung zu präsentieren.

WAS SIE NICHT TUN SOLLTEN

override func viewDidLoad() {
    super.viewDidLoad() 
    self.present(MyNextVC(), animated: true, completion: nil)
}

WAS DU MACHEN SOLLTEST

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)
}
Ugo Marinelli
quelle
1
Anstatt eine Verzögerung zu verwenden, würde ich den Code in viewDidAppear oder viewDidLayoutSubviews einfügen.
Pranav Kasetti
0

Ich hatte dieses Problem, als ich vergaß, Break einzustellen. nach dem Drücken der Ansicht in einer switch-Anweisung!

Wie hier:

case 1:{

        SomeViewController *someViewController = [[SomeViewController alloc]initWithNibName:@"SomeViewController" bundle:Nil];
        [self.navigationController pushViewController:someViewController animated:YES];
        [someViewController release];
    }

        break; //Forgetting to set break here:
Alex McPherson
quelle
0

Der Grund für den Fehler "Unausgeglichene Aufrufe zum Beginnen / Beenden von Erscheinungsübergängen" liegt in der Navigation zu | zweimal gleichzeitig segeln

poa
quelle
0

Eine Lösung wäre:

[NSTimer scheduledTimerWithTimeInterval:0.05(or as required) target:self
selector:@selector(your_selector_method_to_push_the_view) userInfo:nil repeats:NO];
user3390994
quelle
0

Sie können darauf stoßen, wenn Sie versuchen, einen UIViewController zu schließen, bevor er vollständig geladen ist.

Ich hatte diese Nachricht in der Konsole und konzentrierte mich ausschließlich auf den UIViewController, der den neuen UIViewController vorstellte. Endlich stellte ich fest, dass das Problem im UIViewController, den ich vorstellte, sich selbst entließ, weil der Benutzer nicht in seinem Konto angemeldet war.

Hoffe das hilft jemandem.

Mark Hennings
quelle
0

Das war eine schwierige Frage für mich: Ich habe überschrieben

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

ohne zu überschreiben:

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

in meinem Windows Root Navigation Controller. dann beschwerte sich ein untergeordneter Navigationscontroller, als er einen anderen Ansichtscontroller mit der oben genannten Warnung drückte. Die Warnung war nicht die schlimmste, das große Problem war, dass dort der Delegierte des untergeordneten Navigationscontrollers nicht mehr angerufen wurde. weired.

heiko
quelle
0

In meinem Fall habe ich NSDatavon NSURLinnen ' viewDidLoad' Methode abgerufen .

BhushanVU
quelle