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:
- Kontroler pochodzenia może wrócić do dowolnego innego kontrolera docelowego (nie tylko poprzedniego), nie wiedząc nic o miejscu docelowym.
- Sekwencje push i pop są zdefiniowane w serii ujęć, więc nie ma kodu nawigacyjnego w kontrolerach widoku.
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:
@IBAction func unwindToContact(_ unwindSegue: UIStoryboardSegue) {
//let sourceViewController = unwindSegue.source
// Use data from the view controller which initiated the unwind segue
}
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:
performSegue(withIdentifier: "unwindToContact", sender: self)
Przekonałem się, że takie podejście przynosi wiele korzyści, gdy nawigacja zaczyna się komplikować.
Mam nadzieję, że to komuś pomoże.