2012-04-04 14 views
45

Mam widok na storyboardie, który ma przycisk do wykonania określonej akcji. Aby wykonać tę akcję, użytkownik musi być zalogowany. Program obsługi przycisku sprawdza, czy użytkownik jest zalogowany i wykonuje jedną zmianę, jeśli TAK i inny, jeśli NIE. Sekwencje NO przesuwają się do kontrolera widoku logowania. Istnieje kolejna zmiana związana z pierwszym kontrolerem widoku, więc jeśli logowanie zakończy się pomyślnie, użytkownik może wybrać miejsce, w którym przerwał połączenie. Kontrolery widoku są osadzone w kontrolerze nawigacyjnym.Jak przenieść z powrotem do UIViewController, który jest już załadowany?

Problem polega na tym, że "powrót" ładuje zupełnie nowe wystąpienie kontrolera widoku i nie odwołuje się do oryginalnej instancji, więc kończę z pustymi elementami interfejsu i 2 kopiami tego kontrolera widoku w pamięci.

Jak mogę powrócić do oryginalnej instancji kontrolera widoku?

Odpowiedz

135

Zakładając, że używasz "push" masz na myśli, że używasz UINavigationController, możesz użyć następujących elementów, aby powrócić na górę stosu.

[self.navigationController popToRootViewControllerAnimated:YES]; 

lub

UIViewController *prevVC = [self.navigationController.viewControllers objectAtIndex:<n>]; 
[self.navigationController popToViewController:prevVC animated:YES]; 

pop do określonego poziomu, gdzie <n> jest poziom.

lub

[self.navigationController popViewControllerAnimated:YES]; 

Jeśli chcesz po prostu pop jeden poziom wstecz w górę stosu nawigacji.

+1

Mam przycisk UIBarButton, który jest początkowo załadowany w ViewDidLoad na poprzednim ekranie (ten, do którego wracamy). Kiedy używam twojego kodu, UIBar nie pokazuje się wcale. Każdy pomysł, dlaczego? – c0d3Junk13

33

Zamiast używać segmentu, aby powrócić do poprzedniego kontrolera, powinieneś użyć zdarzenia, które było powiązane z powrotem do przełączania, aby zamiast tego odrzucić bieżący kontroler widoku (jeśli mod był modalny) lub pop to z kontrolera nawigacji (jeśli przejście było push), a poprzedni kontroler wyświetli się automatycznie.

Na przykład, jeśli odcinek modalny, który powraca, był wykonywany po naciśnięciu przycisku na ekranie logowania, usuwasz segue z scenorysu i dotykowy wewnątrz zdarzenia przycisku, który łączysz z akcją, , po pomyślnym zalogowaniu wezwie:

[self dismissViewControllerAnimated:YES completion:nil]; 

w serii ujęć, można kliknąć prawym przyciskiem myszy na przycisk i przeciągnij dotyk wewnątrz wysłany zdarzenie do pierwszego odpowiadającego sceny widok kontrolera. Spowoduje to wykonanie przejścia wstecznego, które zostało wykonane po przeprowadzeniu przejścia do przejścia. Możesz użyć modalnej segue, bez potrzeby korzystania z kontrolera nawigacyjnego.

Po naciśnięciu widoku logowania na kontroler nawigacyjny należy go wyjąć ze stosu (w przypadku powrotu do poprzedniego widoku). Użyj jednego z nich:

[[self navigationController] popViewControllerAnimated:YES]; // goes back to previous view 
[[self navigationController] popToViewController: myViewControllerAfterLogin animated:YES]; // goes back to specific view on stack. 
[[self navigationController] popToRootViewControllerAnimated:YES]; // goes back to first view on the stack 

Animowany przejściowy powinien odwrócić rodzaj przejścia używanego na segue, więc zwijają się będą zwinięte w dół, gdy oddalenie widoku.

+0

Jeśli używasz niestandardowego przejścia, takiego jak efekt bezsuwki w przypadku segmentu wypychania, pop nie będzie odwrotnością niestandardowego przejścia, ale po prostu efekt slajdu. – nenchev

2

malhal ma rację - warto kliknąć na jego link.

Wygląda na to, że kod nieco się przesunął z przykładu Apple i jest jeszcze bardziej elastyczny. Mam trzy sceny, ale tylko jeden niestandardowy plik m. ViewController. Nie chciałem stosu nawigacyjnego. Dostęp do kolejnych scen to segues z przycisków. I dodaje ten wiersz w widoku Podstawa kontroler .m pliku:

- (IBAction)unwindForSegue:(UIStoryboardSegue *)unwindSegue towardsViewController:(UIViewController *)subsequentVC{} 

Następnie w trzeciej scenie kontrolować-przeciągnięty z przyciskiem na ikonę wyjścia i wybraniu odwijania działania. Teraz wraca ze sceny 3 z powrotem do sceny 2 bez potrzeby wywoływania metody dismissViewController.

+0

Myślę, że kluczową rzeczą, którą w końcu zrozumiałem, było to, że odwija ​​twój stos, dopóki nie dostanie się do kontrolera, który implementuje unwindAction związaną z konkretnym segmentem wyjścia, którego używasz. Możesz więc zdefiniować wiele sekwencji wyjściowych za pomocą różnych akcji odwijających, a następnie zaimplementować określone działanie rozwijania w kontrolerze, w którym chcesz wylądować, dla każdego z seguesów. –

Powiązane problemy