3

Ich habe ein Problem mit einer iPhone App mit UINavigationController. Wenn ich pushNavigationController verwende, funktioniert es gut. Das iPhone führt seine Animation durch, während es zum nächsten ViewController wechselt. Wenn Sie jedoch ein Array von ViewControllern und die setViewControllers-Methode verwenden, weist die Animation einen Fehler auf, der zu einem deutlich sichtbaren Animationsfehler werden kann.Die Verwendung von setViewController von UINavigationController auf dem iPhone verhält sich nicht richtig

Das folgende Snippet wird im Stamm ViewController aufgerufen. Abhängig von einer Bedingung sollte entweder zu ViewController1 gewechselt werden, oder es sollte direkt zu ViewController2 gehen. Im letzteren Fall kann der Benutzer zurück zu vc1 und dann zum root navigieren.

NSMutableArray* viewControllers = [NSMutableArray arrayWithCapacity:2]; 
// put us on the stack 
[viewControllers addObject:self]; 
// add first VC 
AuthentificationViewController* authentificationViewController = 
    [[[AuthentificationViewController alloc] initWithNibName:@"AuthentificationViewController" bundle:nil] autorelease]; 
[viewControllers addObject:authentificationViewController]; 

if (someCondition == YES) 
{ 
UserAssignmentsListViewController* userAssignmentsListViewController = 
     [[[UserAssignmentsListViewController alloc] initWithNibName:@"UserAssignmentsOverviewViewController" bundle:nil] autorelease]; 

[viewControllers addObject:userAssignmentsListViewController]; 
} 

[self.navigationController 
    setViewControllers:[NSArray arrayWithArray:viewControllers] animated:YES]; 

Wie man sehen kann ich die ersten hinzufügen würde und vielleicht die zweite VC auf das Array, schließlich die Navigation mit Animation Stack Einstellung. Dies funktioniert ordnungsgemäß, wenn ich nur den ersten Controller hinzufüge. Wenn die Animation jedoch zum zweiten Controller gehen soll, wird der Titel der Navigationsleiste nicht "einfliegen". Stattdessen gibt es einen leeren Titel, bis die Animation beendet ist. Und noch schlimmer, wenn ich den Navbar-Titel durch eine benutzerdefinierte Schaltfläche ersetze, wird diese Schaltfläche in der oberen linken Ecke angezeigt, bis die Animation beendet ist. Das ist ein ziemlich anzeigender Fehler.

Ich habe versucht, eine Problemumgehung mit mehreren PushViewController-Methoden zu verwenden, aber die Animation sieht nicht richtig aus. Ich möchte, dass die Navigation ihre Animation auf die gleiche Weise wie pushViewController ausführt. Der einzige Unterschied ist, dass ich keinen VC hinzufüge, sondern den gesamten Stack auf einmal setze. Gibt es hier einen weiteren Workaround, oder könnte dies als Bug eines Frameworks betrachtet werden? Ich dachte darüber nach, nur pushNavController für VC2 zu verwenden, und dann irgendwie VC1 in den Stack einzufügen, aber das scheint nicht möglich zu sein.

Danke für alle Tipps und Hinweise. :-)

Technische Daten: Ich verwende iOS 4.2, kompiliere für 4.0.

+0

Haben Sie eine Lösung gefunden? Wenn ja, bitte teilen. Ich stehe vor einem ähnlichen Animationsproblem. – Pria

+0

Nein, keine Lösung, die wie das normale Verhalten mit pushNavigationController funktioniert. Ich füge noch VC hinzu und rufe setVIEWControllers auf, aber die zweite VC hat zuerst keinen Navigationsleistentitel. Ich stelle es ein (in meinem Fall ist es ein Titelknopf), nachdem die Animation fertig ist. Sieht nicht so gut aus, funktioniert aber. – qwertfisch

Antwort

5

Endlich fand ich die Lösung. Der Fehler bestand darin, dass der neue NavigationController der obersten Ebene nicht ordnungsgemäß initialisiert und geladen wurde, bis die Animation beendet ist. In meinem Fall hat UserAssignmentsListViewController eine viewDidLoad Methode, die nicht aufgerufen wird, bis die Animation fertig ist, aber es setzt den Navigationstitel (hier: ein UIButton). Daher schlägt die Animation fehl.

Die Lösung bezieht sich auf einen bereits initialisierten View-Controller, wenn es auf den Stack geschoben wird. So initialisieren unseren Top-Level-VC irgendwo:

// initialize our top-level controller 
ViewController* viewController2 = [[[ViewController alloc] 
    initWithNibName:@"ViewController" bundle:nil] autorelease]; 

dann beim Schieben von zwei oder mehr VCs auf den Stapel, die obersten Ebene ein bereits initialisiert und die Animation funktioniert (nach dem Beispiel von meiner ursprünglichen Frage):

NSMutableArray* viewControllers = [NSMutableArray arrayWithCapacity:2]; 
// put us on the stack, too 
[viewControllers addObject:self]; 

ViewController* viewController1 = [[[ViewController alloc] 
    initWithNibName:@"ViewController" bundle:nil] autorelease]; 
[viewControllers addObject:viewController1]; 

if (someCondition == YES) 
{ 
    [viewControllers addObject:viewController2]; 
} 

[self.navigationController 
    setViewControllers:[NSArray arrayWithArray:viewControllers] animated:YES]; 
Verwandte Themen