2013-09-24 13 views
7

Ich habe den folgenden Code:IOS 7: UINavigationBar nicht synchron mit UINavigationController

NSArray* stack = self.navigationController.viewControllers; 
NSArray* newStack = @[stack[0], stack[2]]; 
[self.navigationController setViewControllers:newStack animated:NO]; 

stack enthält 3 Ansicht Controller. Das Problem besteht darin, dass die Navigationsleiste die zu vergleichenden UINavigationItems nicht entfernt, sodass self.navigationController.navigationBar.items.count nach dem Ausführen dieses Codes immer noch 3 zurückgibt. Wenn du zurück gehst, gerätst du in einen komischen Zustand, in dem du oben einen Knopf hast, den du drücken kannst, aber er verschwindet einfach und bringt dich nicht weiter zurück.

Ist das ein Fehler in iOS 7 oder versuche ich gerade etwas wirklich Dummes zu tun? Was ist der beste Weg, um dies zu beheben oder zu umgehen?

+1

Alle Antworten oder Korrekturen? – nicktmro

Antwort

0

Das Verhalten, das Sie beschreiben, ist ein beschädigter Navigationssteuerungsstapel. Dies liegt wahrscheinlich daran, dass Sie versuchen, navigationController nicht ordnungsgemäß zu verwenden. Ich habe hier nicht viel Zusammenhang mit dem Code, aber ich vermute, dass Sie versuchen, zu Ihrem Root-View-Controller zurückzuspringen? Ich denke, das wahrscheinlich mehr ist, was man braucht:

https://developer.apple.com/library/ios/documentation/uikit/reference/UINavigationController_Class/Reference/Reference.html#//apple_ref/occ/instm/UINavigationController/popToRootViewControllerAnimated:

Sie erhalten dann eine individuelle Back-Button mit etwas hinzufügen wollen, wie so:

UIBarButtonItem* backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStyleBordered target:self action:@selector(yourMethodToPopToRoot)]; 
//yourMethodToPopToRoot is a method you create that runs popToRootViewController 
self.navigationItem.leftBarButtonItem = backButton; 

Noch Fragen Sie mich bitte.

9

Die navigationBar hat einen eigenen 'items' stack, der erst dann aktualisiert wird, wenn viewDidAppear Treffer erzielt. Das bedeutet, wenn wir den Stack der Navigationssteuerungen in viewDidLoad mit setViewControllern neu erstellen: Wenn wir zu ViewDidAppear gelangen, wird der aktuelle Eintrag zum "items" -Stack der Leisten hinzugefügt, und daher wird der viewController-Stack von UINavController nicht vorhanden sein synchron mit dem UINavBar-Elementstapel. Dies scheint ein iOS 7 Bug zu sein.

In iOS 6.0 kommen die 2 verschiedenen Stacks nicht aus dem Takt, egal wo wir den neuen viewControllers Stack einstellen.

Also versuchen Sie, Ihren Code in viewDidAppear bewegen und sehen, ob das das Problem behebt. Ich wette, es wird, denn für mich hat es getan.

+0

Sieht dies auch in iOS 9.2.1. Hier ist ein minimal reproduzierbares Beispiel, wenn jemand interessiert ist - http://pastebin.com/Ef8Z6yWW – Anurag

Verwandte Themen