Staram się znaleźć dobre rozwiązanie tego problemu. W -viewWillDisappear:
metodzie kontrolera widoku muszę znaleźć sposób na ustalenie, czy dzieje się tak, ponieważ kontroler widoku jest wypychany na stos kontrolera nawigacji, czy też dlatego, że kontroler widoku znika, ponieważ został wyskakujący.
W tej chwili ustawiam flagi takie jak isShowingChildViewController
ale robi się to dość skomplikowane. Myślę, że jedyny sposób, w jaki mogę to wykryć, to -dealloc
metoda.
ios
iphone
cocoa-touch
uiviewcontroller
uikit
Michael Waterfall
źródło
źródło
viewWillAppear
wydaje się, że niezależnie od tego, czy kontroler widoku jest ujawniany przez wypychanie go, czy coś nad nim jest otwierane, tablica viewControllers jest taka sama w obu kierunkach! Jakieś pomysły?viewDidLoad
ponieważ jest wywoływany tylko raz! Hmm, podstępny!![viewControllers containsObject:self]
tego zamiast[viewControllers indexOfObject:self] == NSNotFound
? Wybór stylu?-isMovingFromParentViewController
Metoda wspomniana poniżej umożliwia sprawdzenie, czy widok jest jawnie wyskakujący.Myślę, że najłatwiej jest:
Szybki:
źródło
Z dokumentacji firmy Apple w UIViewController.h:
Więc tak, jedynym udokumentowanym sposobem na to jest następujący sposób:
Wersja Swift 3:
źródło
Jeśli chcesz po prostu wiedzieć, czy widok jest coraz trzasnął, właśnie odkryła, że
self.navigationController
jestnil
wviewDidDisappear
, kiedy jest usuwany ze stosu kontrolerów. Więc to jest prosty alternatywny test.(Odkryłem to po wypróbowaniu różnych innych wygięć. Jestem zaskoczony, że nie ma protokołu kontrolera nawigacji, który rejestrowałby kontroler widoku, który ma być powiadamiany o wyskakujących okienkach. Nie możesz go używać,
UINavigationControllerDelegate
ponieważ faktycznie działa on na wyświetlaczu).źródło
Szybki 4
źródło
W Swift:
źródło
Uważam, że dokumentacja Apple na ten temat jest trudna do zrozumienia. To rozszerzenie pomaga zobaczyć stany przy każdej nawigacji.
źródło
To pytanie jest dość stare, ale widziałem je przez przypadek, więc chcę opublikować najlepsze praktyki (afaik)
możesz po prostu zrobić
źródło
Dotyczy to iOS7 , nie mam pojęcia, czy dotyczy to innych. Z tego co wiem, w
viewDidDisappear
widoku już wyskoczył. Co oznacza, że gdy zapytaszself.navigationController.viewControllers
, otrzymasz pliknil
. Więc po prostu sprawdź, czy to zero.TL; DR
źródło
Segues może być bardzo skutecznym sposobem radzenia sobie z tym problemem w iOS 6+. Jeśli nadałeś konkretnemu segue identyfikator w Interface Builder, możesz go sprawdzić w
prepareForSegue
.źródło
Dzięki @Bryan Henry, nadal działa w Swift 5
źródło
Zakładam, że masz na myśli, że twój widok jest przesuwany w dół stosu kontrolera nawigacji przez wypychanie nowego widoku, gdy mówisz, że został on przeniesiony na stos. Sugerowałbym użycie
viewDidUnload
metody, aby dodaćNSLog
instrukcję, aby zapisać coś na konsoli, abyś mógł zobaczyć, co się dzieje, możesz dodaćNSLog
doviewWillDissappeer
.źródło
Oto kategoria, w której można osiągnąć to samo, co odpowiedź sbrocket:
Nagłówek:
Źródło:
źródło