Also schiebe ich einen View Controller von RootViewController wie folgt:
[self.navigationController pushViewController: anotherViewController animiert: YES];
ABER ab anotherViewController
sofort möchte ich wieder auf den RootViewController zugreifen.
Ich versuche
// (jetzt in einem anderen ViewController) /// RootViewController * root = (RootViewController *) self.parentViewController; // Nein. // irren RootViewController * root = (RootViewController *) [self.navigationController.viewControllers objectAtIndex: 0]; // JA!! Es klappt
Ich bin mir nicht sicher, WARUM das funktioniert und ich bin mir nicht sicher, ob es der beste Weg ist, dies zu tun. Kann jemand einen besseren Weg kommentieren, um den RootViewController von einem Controller zu erhalten, den Sie in den Navigationscontroller dieses RootViewControllers geschoben haben, und ob die Art und Weise, wie ich es gemacht habe, zuverlässig ist oder nicht?
ios
iphone
uinavigationcontroller
Bobobobo
quelle
quelle
Antworten:
Verwenden Sie die viewControllers- Eigenschaft des UINavigationController. Beispielcode:
Dies ist die Standardmethode, um den "Back" -Ansichts-Controller zu erhalten. Der Grund dafür
objectAtIndex:0
ist, dass der Ansichts-Controller, auf den Sie zugreifen möchten, auch der Stamm-Controller ist. Wenn Sie tiefer in der Navigation wären, wäre die Rückansicht nicht mit der Stammansicht identisch.quelle
rootViewController
fehlt*
davor, und der Index sollte nur sein0
. Der Code in der Frage ist korrekt:RootViewController *root = (RootViewController *)[navigationController.viewControllers objectAtIndex:0]
Schnelle Version:
ObjectiveC-Version:
Wobei self eine Instanz eines UIViewControllers ist, der in einen UINavigationController eingebettet ist.
quelle
Eine etwas weniger hässliche Version derselben Sache, die in so ziemlich allen diesen Antworten erwähnt wurde:
In Ihrem Fall würde ich wahrscheinlich so etwas tun:
in Ihrer UINavigationController-Unterklasse :
dann können Sie verwenden:
bearbeiten
OP fragte in den Kommentaren nach einer Eigenschaft.
Wenn Sie möchten, können Sie darauf zugreifen,
self.navigationController.rootViewController
indem Sie Ihrem Header einfach eine schreibgeschützte Eigenschaft hinzufügen:quelle
Für alle, die an einer schnellen Erweiterung interessiert sind, ist dies das, was ich jetzt benutze:
quelle
Als Ergänzung zu @ dulgans Antwort ist es immer ein guter Ansatz,
firstObject
over zu verwendenobjectAtIndex:0
, da der erste Wert nil zurückgibt, wenn sich kein Objekt im Array befindet, der letztere eine Ausnahme auslöst.Alternativ wäre es ein großes Plus für Sie, eine Kategorie mit dem Namen zu erstellen
UINavigationController+Additions
und Ihre Methode darin zu definieren.quelle
Wie wäre es, wenn Sie den UIApplication- Singleton nach seinem keyWindow fragen und von diesem UIWindow aus nach dem Root-View-Controller (seiner rootViewController- Eigenschaft) fragen :
quelle
Hier habe ich mir eine universelle Methode ausgedacht, um von jedem Ort zur Wurzel zu navigieren.
Mit dieser Klasse erstellen Sie eine neue Klassendatei, sodass Sie von überall in Ihrem Projekt darauf zugreifen können:
Verwendung von überall in Ihrem Projekt:
quelle
Das hat bei mir funktioniert:
Wenn mein Root View Controller in einen Navigationscontroller eingebettet ist:
Denken Sie daran, dass dies
keyWindow
veraltet ist.quelle