2015-07-22 9 views
6

Próbuję zrozumieć zachowanie nawigacji między ViewControllers z (i bez) za pomocą kontrolera NavigationController i nieporozumienie niektórych rzeczy podczas czytania artykułów i dokumentów, więc postanowiłem je zapytać.ios - Nawigacja między wieloma sterownikami NavigationControllers

Główne pytanie brzmi: Co się stało, jeśli mamy wiele kontrolerów nawigacyjnych w Storyboard i chcemy przejść od jednego do drugiego? (A to można osiągnąć tylko przy użyciu segues jak robimy pomiędzy wspólnymi VC, mam rację?)

Jak rozumiem, o NavigationController reprezentuje stos ViewControllers w którym możemy pop i popychają tych VC. Teraz zmieniamy naszą "lokalizację" z VC pierwszego NavigationControllera na VC z drugiej, co się dzieje dalej? Pierwszy stos zniknął, a teraz pracujemy tylko w drugim? Jeśli tak, czy oznacza to, że stos VC pierwszego kontrolera NavigationController został usunięty z pamięci, czy nie?

Może coś zupełnie nie rozumiem, a może nie :). Będę szczęśliwy mogąc zobaczyć twoje odpowiedzi i mam nadzieję, że zadam ci bardziej szczegółowe pytania dotyczące mechaniki nawigacji.

UPDATE

Chodzi o to, że: Załóżmy, że mamy jeden (pierwszy) VC z dwoma przyciskami, które reprezentują dwie oddzielne części aplikacji. Następnie klikamy pierwszy przycisk i przechodzimy do RootVC jednego NC, a potem wracamy do naszego początkowego VC i wciskamy drugi przycisk i przechodzimy do kolejnego NC. Co stało się ze stosem pierwszego NC, kiedy wracamy do początkowego VC i jaki jest najlepszy sposób, aby przejść "na zewnątrz" NC do początkowego VC?

UPDATE

Próbuję zrozumieć, co dzieje się z pamięcią i które VC są na scenie w tej chwili i tak dalej. Może to absolutnie nieistotne, jeśli mamy jakieś dodatkowe VC w scenie, może potrzebujemy ich, aby szybciej przełączać się pomiędzy NC (lub po prostu VC). Chcę tylko zrozumieć, jak to działa.

Odpowiedz

4

Wyobraź sobie, że masz standardowy łańcuch aplikacji, w którym wyświetlasz widoki pop/pop w początkowym kontrolerze nawigacyjnym. Następnie wyobraź sobie, że mają inny pogląd, który nie jest częścią tego łańcucha, jak profil użytkownika, którego obecny jako modalne widok:

enter image description here

Teraz górna kontroler nawigacyjny jest początkowy więc zacząć od tego, podczas gdy w celu korzystania z drugą, to masz do niego dostęp za pośrednictwem UIStoryboard tak (czerwona strzałka):

// Get storyboard 
let storyboard = UIStoryboard(name: name, bundle: NSBundle.mainBundle()) 

// Get profile NC 
let profileNC = storyboard.instantiateViewControllerWithIdentifier("LoginNC") as! UINavigationController 

Ale jeśli naprawdę chcesz zaprezentować profil z jednej części aplikacji, więc nie jest modalne, ty może to również zrobić (zielona strzałka).Jedyna różnica polega na tym, że teraz nie potrzebujesz drugiego kontrolera nawigacyjnego - więc nie podłączasz pchania do czerwonego NC, ale do bezpośredniego logowania kontrolera widoku. Jeśli rzeczywiście spróbujesz połączyć NC - NC, a następnie go uruchomisz, otrzymasz wyjątek środowiska wykonawczego, mówiąc, że zrobiłeś to źle.

pamięci

cały pobyt VC w pamięci, bez względu na sposób ich prezentacji. Odnosi się to również do widoków tła, gdy prezentujesz coś modalnego. Jeśli masz problemy z pamięcią z powodu długich łańcuchów, możesz wdrożyć logikę czyszczenia/buforowania w kontrolerach:

func viewWillAppear(animated: Bool) { 

    // Call super first 
    super.viewWillAppear(animated) 

    // Prepare UI 
} 

func viewWillDisappear(animated: Bool) { 

    // Call super first 
    super.viewWillAppear(animated) 

    // do some memory cleanup, since view will not be visible atm 
} 

Mam nadzieję, że pomoże!

+0

Dziękuję za szczegółową odpowiedź, teraz ma to dla mnie sens! Jak rozumiem z [jedyna różnica polega na tym, że teraz nie potrzebujesz drugiego kontrolera nawigacyjnego - więc nie podłączasz pchania do czerwonego NC_] i [_Wszystko VC pozostaje w pamięci, bez względu na to, jak je prezentujesz.] nie ma potrzeby posiadania wielu NC w aplikacji, tworzymy tylko jedno NC i robimy wszystkie rzeczy w nim, prawda? Czy możesz podać przykład, kiedy potrzebujemy wielu NC w aplikacji? – Max

+0

Tak, jeśli tylko naciskasz i piszemy VC, wystarczy jeden kontroler nawigacyjny. Myślę, że najlepszym przykładem użycia dla wielu kontrolerów nawigacyjnych jest to, że po opuszczeniu menu w aplikacji zmienia się widok główny (przechodzisz do jakiejś listy, ale także formularz kontaktowy itd.) Masz wtedy wiele początkowych punktów, z którymi użytkownik współdziała - i miałbyś taką samą ilość NC-ów również :) –

+0

W jednym z moich komentarzy do @Glorfindel powiedziałem o jednym VC (początkowym) z dwoma przyciskami, które przechodzą do różnych części aplikacji (jakiś lewy panel; D). W tym przypadku po przejściu z Initial VC do jednego z NCs robimy ostatni jako widok root, czy mam rację? A co dzieje się z innymi (np. Kiedy przełączamy się między tymi NC)? A także, jak przejść z VC jednego NC do konkretnego VC w innym NC we właściwy sposób? (tylko przy użyciu show show?) – Max

0

Co ma sens, to przedstawienie nowego kontrolera UINavigationController z jego kontrolkami widoku podrzędnego z istniejącego jako modalnego dialogu (można to zrobić przy pomocy modalnego segue). Każdy kontroler nawigacyjny ma własny stos, a gdy jesteś zajęty w oknie dialogowym, stos "master" pozostaje nienaruszony. Kiedy zamkniesz okno dialogowe, powrócisz do "master".

Nie jestem pewien, czy technicznie możliwe jest przesunięcie kontrolera nawigacyjnego na istniejący. Nie ma to jednak sensu.

+0

Jak rozumiem, dodaje jeden NavigationController do stosu innych? Nie potrzebuję takiego zachowania (i nie mogę sobie wyobrazić, gdzie można go użyć). Chodzi o to, że: Załóżmy, że mamy jeden (początkowy) VC z przyciskami, które reprezentują dwie oddzielne części aplikacji. Następnie klikamy pierwszy przycisk i przechodzimy do RootVC jednego NC, a potem wracamy do naszego początkowego VC i wciskamy drugi przycisk i przechodzimy do kolejnego NC. Co stało się ze stosem pierwszego NC, kiedy wracamy do początkowego VC i jaki jest najlepszy sposób, aby przejść "na zewnątrz" NC do początkowego VC? – Max

+0

Zaktualizowałem pytanie tym komentarzem – Max

+0

Zachowanie, które chcesz mi przypominać, UITabBarController, który utrzymuje kilka kontrolerów widoku podrzędnego (które mogą być kontrolerami nawigacyjnymi). W takim przypadku kontroler paska kart utrzymuje stan każdego kontrolera nawigacyjnego. – Glorfindel

Powiązane problemy