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?
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?
Antworten:
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.
In meinem Fall ist es passiert, als ich [self performSegueWithIdentifier:@"SomeIdentifier" sender:self];
innerhalb UINavigationController
der viewDidLoad
Methode eines Elements ausgelöst habe .
Das Verschieben in die viewDidAppear
Methode löste das Problem.
Der Grund ist sehr wahrscheinlich, dass viewDidLoad
nicht alle ausgefallenen Animationen bereits fertig sind, während in viewDidAppear
allem alles erledigt ist.
Ich habe auch dieses Problem. Ich habe zwei Lösungen für dieses Problem gefunden:
UINavigationController
in der dieses Problem behoben wurde. Gepufferter NavigationscontrollerSie 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];
});
dispatch_async
Hauptwarteschlange einzuschließen . Die Sache dispatch_async
ist, 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];});
Ich hatte viele Probleme mit dem gleichen Problem. Ich habe das auf diese Weise gelöst
1) Sie verwenden keinen UIViewController's
bestimmten Initialisierer initWithNibName:bundle:
. Versuchen Sie es statt nur init
.
2) animated:YES
auf NEIN setzen, und das hat das Problem gelöst. z.B.[self.navigationController pushViewController: viewController_Obj animated:NO];
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.
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
super.viewWillAppear()
Innerhalb anrufen viewDidDisappear()
.
'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.
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;
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)
}
}
}
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.
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
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
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.
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:
Ich hatte eine Logik implementiert, um zu warten, UIViewController
bis alle Daten heruntergeladen wurden. Es gab einen Fehler in dieser Logik, der dazu führte, dass das UIViewController
zu früh gepusht wurde, während noch ein weiterer API-Aufruf ausgeführt wurde.
Es bewirkte, dass das gleiche UIViewController
zweimal von der gedrückt wurde UINavigationController
und gab diese Warnung.
Grund für Meldung: Diese Meldung wenn bekommen angezeigt und nur , wenn Sie drängen / präsentieren eine andere View - Controller aus viewWillAppear
, loadView
, init
oder viewDidLoad
Methode der aktuellen View - Controller
So entfernen Sie Fehlermeldungen: Verschieben Sie Ihren Push- / Präsentationscode in die viewDidAppear
Methode, um das Problem zu beheben
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)
}
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:
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];
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.
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.