Chodzi o stworzenie aplikacji za pomocą a, UINavigationController
aby zaprezentować następne kontrolery widoku. W iOS5 pojawiła się nowa metoda prezentacji UIViewControllers
:
presentViewController:animated:completion:
Teraz pytam mnie, dlaczego nie ma programu obsługi zakończenia UINavigationController
? Są po prostu
pushViewController:animated:
Czy jest możliwe stworzenie własnego programu obsługi uzupełniania, takiego jak nowy presentViewController:animated:completion:
?
viewDidAppear:animated:
niech ci na ekranie pojawi się twoje widok kontrolera każdorazowo wykonanie kodu (viewDidLoad
tylko za pierwszym razem kontroler widoku jest ładowany)-(void)viewDidAppear:(BOOL)animated
Odpowiedzi:
Zobacz odpowiedź par na inne i bardziej aktualne rozwiązanie
UINavigationController
animacje są uruchamiane zCoreAnimation
, więc sensowne byłoby umieszczenie w nich koduCATransaction
i ustawienie w ten sposób bloku uzupełniania.Szybki :
Dla szybkiego sugeruję utworzenie rozszerzenia jako takiego
Stosowanie:
Cel C
Nagłówek:
Realizacja:
źródło
pushViewController:animated:
orpopViewController:animated
, wywołaniaviewDidLoad
i mająviewDidAppear
miejsce w kolejnych cyklach runloop. Mam więc wrażenie, że nawet jeśli te metody wywołują animacje, nie będą one częścią transakcji podanej w przykładowym kodzie. Czy to był twój problem? Bo to rozwiązanie jest bajecznie proste.didShowViewController
. Chociaż to rozwiązanie jest fantastycznie proste, kwestionowałbym jego „przyszłościowość”. Zwłaszcza biorąc pod uwagę zmiany w wyświetlaniu wywołań zwrotnych cyklu życia, które pojawiły się w iOS 7/8iOS 7+ Swift
Swift 4:
EDYCJA: Dodałem wersję Swift 3 mojej oryginalnej odpowiedzi. W tej wersji usunąłem przykładową animację pokazaną w wersji Swift 2, ponieważ wydaje się, że zdezorientowała wiele osób.
Swift 3:
Swift 2:
źródło
nil
jako blok animacji.nil
jest rzeczą całkowicie słuszną.transitionCoordinator
jest zero?transitionCoordinator
to prawdopodobnie wywołujesz tę funkcję zbyt wcześnie w cyklu życia kontrolera nawigacji. Poczekaj przynajmniej doviewWillAppear()
wywołania, zanim spróbujesz wypchnąć kontroler widoku z animacją.Na podstawie odpowiedzi par (która była jedyną, która działała z iOS9), ale prostsza iz brakującym innym (co mogłoby doprowadzić do tego, że zakończenie nigdy nie zostało wywołane):
źródło
Obecnie
UINavigationController
nie obsługuje tego. Ale jest toUINavigationControllerDelegate
, czego możesz użyć.Łatwym sposobem osiągnięcia tego jest tworzenie podklas
UINavigationController
i dodanie właściwości bloku uzupełniania:Przed naciśnięciem nowego kontrolera widoku musiałbyś ustawić blok uzupełniania:
Ta nowa podklasa może być przypisana w programie Interface Builder lub używana programowo w następujący sposób:
źródło
pushViewController:animated:completion:
, uczyniłaby to eleganckim rozwiązaniem.Oto wersja Swift 4 z Pop.
Na wypadek, gdyby ktoś tego potrzebował.
źródło
Aby rozwinąć odpowiedź @Klaas (iw rezultacie tego pytania) dodałem bloki uzupełniania bezpośrednio do metody push:
Do wykorzystania w następujący sposób:
źródło
if... (self.pushedVC == viewController) {
jest nieprawidłowe. Musisz przetestować równość między obiektami, używającisEqual:
, np.[self.pushedVC isEqual:viewController]
isEqual
prawdopodobnie byłoby bardziej poprawne technicznie, gdyby kiedykolwiek to zrobili.Od iOS 7.0 możesz użyć,
UIViewControllerTransitionCoordinator
aby dodać blok uzupełniania wypychania:źródło
Swift 2.0
źródło
Potrzeba trochę więcej pracy, aby dodać to zachowanie i zachować możliwość ustawiania delegata zewnętrznego.
Oto udokumentowana implementacja, która zachowuje funkcjonalność delegata:
LBXCompletingNavigationController
źródło