Wysyłam użytkownika do strony jednym kliknięciem przycisku. Ta strona jest UITableViewController .
Teraz, jeśli użytkownik stuknie komórkę, chciałbym go odepchnąć z powrotem na poprzednią stronę.
Myślałem o czymś takim, self.performSegue("back")....
ale wydaje się to złym pomysłem.
Jaki jest właściwy sposób to zrobić?
Odpowiedzi:
Swift 3:
Jeśli chcesz wrócić do poprzedniego kontrolera widoku
Jeśli chcesz wrócić do kontrolera widoku głównego
źródło
.popViewController(animated: true)
_ = self.navigationController?.popToRootViewController(animated: true)
_ =
jest szybka konwencja w tym zakresie.Swift 3 , Swift 4
NavigationController jest opcjonalny, ponieważ może go nie być.
źródło
[weak self]
iself?.navigationController?.
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if let vc = segue.destination as?
Ale kiedy używam tego, nie mogę tego użyćSzybki 3
Być może spóźniłem się z odpowiedzią, ale w przypadku szybkiego 3 możesz to zrobić w ten sposób:
źródło
dismiss:
, nie tylko odrzuci on bieżący kontroler widoku, ale także kontroler widoku głównego, i nie o to tu pytano.dismiss(animated: true, completion: nil)
nie działa po rotacji!Szybki 4
istnieją dwa sposoby powrotu / powrotu do poprzedniego ViewController:
self.navigationController?.pushViewController(yourViewController, animated: true)
w tym przypadku musisz użyćself.navigationController?.popViewController(animated: true)
self.present(yourViewController, animated: true, completion: nil)
w tym przypadku musisz użyćself.dismiss(animated: true, completion: nil)
źródło
W przypadku, gdy przedstawiłeś
UIViewController
z wewnątrzUIViewController
tj.Wystarczy wywołać
dismiss
funkcję:źródło
self.dismiss(animated: true)
- nie działa po rotacjiszybkie 5 i więcej
przypadek 1: korzystanie z kontrolerem nawigacyjnym
przypadek 2: użycie z obecnym kontrolerem widoku
źródło
Jeśli Segue to „Show” lub „Push”, możesz wywołać „popViewController (animated: Bool)” na Instancji UINavigationController. Lub jeśli segue jest rodzajem „obecnym”, to wywołaj „odrzuć (animowane: Bool, zakończenie: (() -> Void)?)” Z instancją UIViewController
źródło
dla swift 3 wystarczy napisać następujący wiersz kodu
źródło
Spróbuj tego: w poprzednim widoku użyj tego:
pop do roota użyj tego kodu:
źródło
Swift 4.0 Xcode 10.0 z TabViewController jako ostatnim widokiem
Jeśli twój ostatni ViewController jest zapisany w TabViewController, poniższy kod wyśle cię do katalogu głównego ...
Ale jeśli naprawdę chcesz wrócić do ostatniego widoku (może to być widok Tab1, Tab2 lub Tab3 ..), musisz napisać poniższy kod:
To działa dla mnie, korzystałem z widoku po jednym z moich TabView :)
źródło
W przypadku pytań dotyczących sposobu osadzania viewController w navigationController w serii ujęć:
źródło
Ten działa dla mnie (Swift UI)
źródło
Zrobiłem to w ten sposób
źródło
Chciałbym zaproponować inne podejście do tego problemu. Zamiast używać kontrolera nawigacyjnego do otwierania kontrolera widoku, użyj sekwencji rozwijania. To rozwiązanie ma kilka, ale naprawdę ważnych zalet:
Więcej informacji można znaleźć w sekcji Odwijanie segmentów krok po kroku . Sposób, w jaki lepiej to wyjaśniono w poprzednim linku, w tym sposób przesyłania danych z powrotem, ale tutaj przedstawię krótkie wyjaśnienie.
1) Przejdź do kontrolera widoku docelowego (nie źródłowego) i dodaj segment rozwijania:
2) CTRL przeciągnij z kontrolera widoku sama do ikony wyjścia w kontrolerze widoku pochodzenie:
3) Wybierz funkcję rozwijania, którą właśnie utworzyłeś kilka chwil temu:
4) Wybierz segment odwijania i nadaj mu nazwę:
5) Przejdź do dowolnego miejsca kontrolera widoku źródłowego i wywołaj odwijanie:
Przekonałem się, że takie podejście przynosi wiele korzyści, gdy nawigacja zaczyna się komplikować.
Mam nadzieję, że to komuś pomoże.
źródło
Mogę przekierować na stronę główną pisząc kod w „viewDidDisappear” kontrolowanego nawigatora,
override func viewDidDisappear(_ animated: Bool) { self.navigationController?.popToRootViewController(animated: true) }
źródło