Więc wypycham kontroler widoku z RootViewController w taki sposób:
[self.navigationController pushViewController: anotherViewController animowana: TAK];
ALE, OD anotherViewController
teraz chcę ponownie uzyskać dostęp do RootViewController.
Próbuję
// (teraz wewnątrz anotherViewController) /// RootViewController * root = (RootViewController *) self.parentViewController; // Nie. // błąd RootViewController * root = (RootViewController *) [self.navigationController.viewControllers objectAtIndex: 0]; // TAK!! to działa
Nie jestem pewien, DLACZEGO to działa i nie jestem pewien, czy to najlepszy sposób, aby to zrobić. Czy ktoś może skomentować lepszy sposób uzyskania RootViewController z kontrolera, który został wypchnięty do navigationController tego RootViewControllera i czy sposób, w jaki to zrobiłem, jest niezawodny, czy nie?
ios
iphone
uinavigationcontroller
bobobobo
źródło
źródło
Odpowiedzi:
Użyj właściwości viewControllers UINavigationController. Przykładowy kod:
Jest to standardowy sposób uzyskiwania kontrolera widoku „wstecz”. Powodem
objectAtIndex:0
jest to, że kontroler widoku, do którego próbujesz uzyskać dostęp, jest również głównym, gdybyś był głębiej w nawigacji, widok z tyłu nie byłby taki sam jak widok główny.źródło
rootViewController
brakuje*
przed nim, a indeks powinien być0
. Kod w pytaniu jest poprawny:RootViewController *root = (RootViewController *)[navigationController.viewControllers objectAtIndex:0]
Wersja Swift:
Wersja ObjectiveC:
Gdzie self jest wystąpieniem UIViewController osadzonym w UINavigationController.
źródło
Nieco mniej brzydka wersja tego samego, o którym mowa w prawie wszystkich tych odpowiedziach:
w twoim przypadku prawdopodobnie zrobiłbym coś takiego:
wewnątrz podklasy UINavigationController :
wtedy możesz użyć:
edytować
OP zapytał o nieruchomość w komentarzach.
jeśli chcesz, możesz uzyskać do tego dostęp za pomocą czegoś takiego, jak
self.navigationController.rootViewController
po prostu dodając właściwość readonly do nagłówka:źródło
Dla wszystkich, którzy są zainteresowani szybkim rozszerzeniem, teraz używam tego:
źródło
Jako dodatek do odpowiedzi @ dulgan , zawsze dobrym podejściem jest użycie
firstObject
overobjectAtIndex:0
, ponieważ podczas gdy pierwsza zwraca nil, jeśli nie ma obiektu w tablicy, druga rzuca wyjątek.Alternatywnie dużym plusem byłoby utworzenie kategorii o nazwie
UINavigationController+Additions
i zdefiniowanie w niej metody.źródło
Co powiesz na zapytanie singletona UIApplication o jego keyWindow i z tego UIWindow poproś o główny kontroler widoku (jego właściwość rootViewController ):
źródło
Tutaj wymyśliłem uniwersalną metodę nawigacji z dowolnego miejsca do katalogu głównego.
Tworzysz nowy plik Class z tą klasą, aby był dostępny z dowolnego miejsca w projekcie:
Wykorzystanie z dowolnego miejsca w projekcie:
źródło
To zadziałało dla mnie:
Kiedy mój główny kontroler widoku jest osadzony w kontrolerze nawigacji:
Pamiętaj, że
keyWindow
jest to przestarzałe.źródło