Jedną z opcji byłoby wdrożenie własnego niestandardowego przycisku powrotu. Konieczne będzie dodanie następującego kodu do metody viewDidLoad:
- (void) viewDidLoad {
[super viewDidLoad];
self.navigationItem.hidesBackButton = YES;
UIBarButtonItem *newBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStyleBordered target:self action:@selector(back:)];
self.navigationItem.leftBarButtonItem = newBackButton;
}
- (void) back:(UIBarButtonItem *)sender {
// Perform your custom actions
// ...
// Go back to the previous ViewController
[self.navigationController popViewControllerAnimated:YES];
}
AKTUALIZACJA:
Oto wersja Swift:
override func viewDidLoad {
super.viewDidLoad()
self.navigationItem.hidesBackButton = true
let newBackButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.Bordered, target: self, action: "back:")
self.navigationItem.leftBarButtonItem = newBackButton
}
func back(sender: UIBarButtonItem) {
// Perform your custom actions
// ...
// Go back to the previous ViewController
self.navigationController?.popViewControllerAnimated(true)
}
AKTUALIZACJA 2:
Oto wersja Swift 3:
override func viewDidLoad {
super.viewDidLoad()
self.navigationItem.hidesBackButton = true
let newBackButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.plain, target: self, action: #selector(YourViewController.back(sender:)))
self.navigationItem.leftBarButtonItem = newBackButton
}
func back(sender: UIBarButtonItem) {
// Perform your custom actions
// ...
// Go back to the previous ViewController
_ = navigationController?.popViewController(animated: true)
}
Zastąpienie przycisku niestandardowym, jak sugerowano w innej odpowiedzi, nie jest dobrym pomysłem, ponieważ stracisz domyślne zachowanie i styl.
Inną opcją jest zaimplementowanie metody viewWillDisappear w kontrolerze widoku i sprawdzenie właściwości o nazwie ismovingFromParentViewController . Jeśli ta właściwość jest prawdziwa, oznacza to, że kontroler widoku znika, ponieważ jest usuwany (otwierany).
Powinien wyglądać mniej więcej tak:
W szybkim 4.2
źródło
override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) if isMovingFromParentViewController { // Your code... } }
viewWillDisappear(animated:)
uruchomi się, jeśli otrzymasz połączenie telefoniczne. Prawdopodobnie nie tego chcesz. Prawdopodobnie lepszy w użyciuwillMove(toParentViewController:)
źródło
parent == nil
jest kiedy ruszamy z powrotem naparent
scenieUdało mi się to osiągnąć w następujący sposób:
Szybki 3
Szybki 4
Nie ma potrzeby niestandardowego przycisku Wstecz.
źródło
Stworzyłem tę (szybką) klasę, aby utworzyć przycisk powrotu dokładnie tak jak zwykły, w tym strzałkę wstecz. Może utworzyć przycisk ze zwykłym tekstem lub obrazem.
Stosowanie
CustomBackButtonClass
(kod do rysowania strzałki wstecz utworzonej za pomocą wtyczki Sketch & Paintcode)
SWIFT 3.0
źródło
Jeśli chcesz mieć przycisk Wstecz ze strzałką Wstecz, możesz użyć obrazu i kodu poniżej
backArrow.png [email protected] [email protected]
źródło
Jeśli używasz,
navigationController
dodajUINavigationControllerDelegate
protokół do klasy i dodaj metodę delegowania w następujący sposób:Ta metoda jest wywoływana za każdym razem, gdy kontroler nawigacyjny przejdzie do nowego ekranu. Jeśli przycisk Wstecz został naciśnięty, nowy kontroler widoku jest
ViewController
sam.źródło
W Swift 5 i Xcode 10.2
Nie dodawaj niestandardowego przycisku na pasku, użyj tego domyślnego zachowania.
Nie ma potrzeby widokuWillDisappear , nie ma potrzeby niestandardowego BarButtonItem itp.
Lepiej jest wykryć, kiedy VC jest usuwane z jego rodzica.
Użyj dowolnej z tych dwóch funkcji
Jeśli chcesz zatrzymać domyślne zachowanie przycisku Wstecz, dodaj niestandardowy BarButtonItem.
źródło
NIE
override func willMove(toParentViewController parent: UIViewController?) { }
Zostanie to wywołane, nawet jeśli przechodzisz do kontrolera widoku, w którym zastępujesz tę metodę. W którym sprawdzenie, czy „
parent
”nil
nie jest, nie jest dokładnym sposobem na upewnienie się, że wrócisz do właściwegoUIViewController
. Aby dokładnie ustalić, czyUINavigationController
prawidłowo nawiguje z powrotem do tego,UIViewController
który prezentował ten bieżący, musisz dostosować się doUINavigationControllerDelegate
protokołu.TAK
Uwaga:
MyViewController
to tylko nazwa tego, coUIViewController
chcesz wykryć, wracając.1) Na górze pliku dodaj
UINavigationControllerDelegate
.2) Dodaj właściwość do swojej klasy, która będzie śledzić
UIViewController
segregację.3) w
MyViewController
„sviewDidLoad
metody assignself
jako delegata Dla PaństwaUINavigationController
.3) Przed segregowaniem przypisz poprzednie
UIViewController
jako tę właściwość.4) I zgodne z jedną metodą
MyViewController
zUINavigationControllerDelegate
źródło
W moim przypadku
viewWillDisappear
działało najlepiej. Ale w niektórych przypadkach trzeba zmodyfikować poprzedni kontroler widoku. Oto moje rozwiązanie z dostępem do poprzedniego kontrolera widoku i działa w Swift 4 :źródło
Przed opuszczeniem obecnego kontrolera muszę pokazać alert. Zrobiłem to w ten sposób:
UINavigationController
pomocąUINavigationBarDelegate
Zadziałało)
źródło
To nie jest trudne, jak my. Po prostu utwórz ramkę dla UIButton z wyraźnym kolorem tła, przypisz akcję do przycisku i umieść nad przyciskiem wstecz paska nawigacji. I na koniec usuń przycisk po użyciu.
Oto przykładowy kod Swift 3 wykonany za pomocą UIImage zamiast UIButton
napisz kod należy wykonać
Usuń widok podrzędny po wykonaniu akcji
źródło
Swift 4.2:
źródło
Swift 3:
źródło
Spróbuj tego .
Spróbuj tego też.
źródło
po prostu kontroluj + przeciągnij element paska poniżej func. działa jak urok
źródło
Możesz podklasować
UINavigationController
i zastępowaćpopViewController(animated: Bool)
. Oprócz możliwości wykonania jakiegoś kodu, możesz również uniemożliwić użytkownikowi całkowite cofnięcie się, na przykład, aby poprosić o zapisanie lub odrzucenie jego bieżącej pracy.Przykładowa implementacja, w której można ustawić ustawienie,
popHandler
które zostanie ustawione / wyczyszczone przez kontrolery wypychane.I przykładowe użycie z kontrolera wypychanego, który śledzi niezapisaną pracę.
Przyjemnym akcentem będzie również wywołanie,
interactivePopGestureRecognizer
gdy użytkownik spróbuje wrócić gestem machnięcia.źródło
To jest moje rozwiązanie
W kontrolerze widoku możesz obsługiwać w następujący sposób:
źródło
Jak rozumiem chcesz opróżnić
array
jak naciśniesz przycisk Wstecz i pop do poprzedniejViewController let
listyArray
, który został załadowany na tym ekranie jestźródło
źródło
źródło
W przypadku Swift 5 możemy sprawdzić, czy widok zniknie
źródło
Swift 5 __ Xcode 11.5
W moim przypadku chciałem zrobić animację, a kiedy się skończy, wróć. Sposób zastąpienia domyślnej akcji przycisku Wstecz i wywołania akcji niestandardowej jest następujący:
Możesz też użyć tej metody jeden raz, aby zbadać hierarchię widoku paska nawigacji i uzyskać indeksy, aby uzyskać dostęp do widoku _UIButtonBarButton, rzutować na UIControl, usunąć akcję docelową i dodać własne akcje docelowe:
źródło
Osiągnąłem to, wywołując / zastępując,
viewWillDisappear
a następnie uzyskując dostęp do stosunavigationController
:źródło
W ten sposób rozwiązałem go dla własnego problemu
źródło
Oto najprostsze możliwe rozwiązanie Swift 5, które nie wymaga tworzenia niestandardowego przycisku Wstecz i rezygnacji z wszystkich funkcji lewego przycisku UINavigationController, które otrzymujesz za darmo.
Jak zaleca Brandon A powyżej, musisz
UINavigationControllerDelegate
wrócić do kontrolera widoku, z którym chcesz wchodzić w interakcję, zanim wrócisz do niego. Dobrym sposobem jest utworzenie segmentu odwijania, który można wykonać ręcznie lub automatycznie i ponownie użyć tego samego kodu z niestandardowego przycisku lub przycisku Wstecz.Po pierwsze, ustaw kontroler widoku będący przedmiotem zainteresowania (ten, do którego chcesz wykryć powrót) na delegata kontrolera nawigacyjnego w jego
viewDidLoad
:Po drugie, dodaj rozszerzenie na dole pliku, które zastępuje
navigationController(willShow:animated:)
Ponieważ twoje pytanie zawierało a
UITableViewController
, podałem sposób uzyskania ścieżki indeksu wiersza, który użytkownik dotknął.źródło
Możesz zrobić coś w swoim Viewcontroller jak
Aby uzyskać pełną odpowiedź, użyj opcji Wykrywanie po naciśnięciu przycisku „wstecz” na pasku nawigacyjnym
źródło