Mam aplikację paska kart z wieloma widokami. Czy istnieje sposób, aby dowiedzieć się, czy konkretny UIViewController
jest obecnie widoczny z wnętrza UIViewController
? (szuka nieruchomości)
ios
uiview
uiviewcontroller
uiwindow
Rob Bonner
źródło
źródło
Odpowiedzi:
Właściwość okna widoku jest różna od zera, jeśli widok jest obecnie widoczny, więc sprawdź widok główny w kontrolerze widoku:
Wywołanie metody widoku powoduje załadowanie widoku (jeśli nie jest załadowany), co jest niepotrzebne i może być niepożądane. Lepiej najpierw sprawdzić, czy jest już załadowany. Dodałem wywołanie do isViewLoaded, aby uniknąć tego problemu.
Od iOS9 stało się łatwiejsze:
Lub jeśli masz UINavigationController zarządzający kontrolerami widoku, możesz zamiast tego sprawdzić jego właściwość visibleViewController .
źródło
topViewController
.Oto rozwiązanie @ progrmr jako
UIViewController
kategorię:źródło
Istnieje kilka problemów z powyższymi rozwiązaniami. Jeśli używasz na przykład a
UISplitViewController
, widok główny zawsze zwróci wartość true dlaZamiast tego zastosuj to proste podejście, które wydaje się działać dobrze w większości, jeśli nie we wszystkich przypadkach:
źródło
Dla tych z Was, którzy szukają odpowiedzi Swift 2.2 :
i Swift 3 :
źródło
W przypadku prezentacji modalnej na pełnym ekranie lub w kontekście, „widoczny” może oznaczać, że znajduje się na wierzchu stosu kontrolera widoku lub jest po prostu widoczny, ale zakryty przez inny kontroler widoku.
Aby sprawdzić, czy kontroler widoku „jest kontrolerem widoku z góry” różni się znacznie od „jest widoczny”, należy sprawdzić stos kontrolera widoku kontrolera nawigacji kontrolera widoku.
Napisałem kawałek kodu, aby rozwiązać ten problem:
źródło
isViewLoaded
jest własnością od Swift 3.0.Chcesz korzystać z
UITabBarController
„sselectedViewController
nieruchomości. Wszystkie kontrolery widoku podłączone do kontrolera paska kart majątabBarController
zestaw właściwości, dzięki czemu możesz w dowolnym kodzie kontrolerów widoku:źródło
((UINavigationController *)self.tabBarController.selectedViewController).visibleViewController
Zrobiłem szybkie rozszerzenie w oparciu o odpowiedź @ progrmr.
Pozwala łatwo sprawdzić, czy
UIViewController
na ekranie jest taki:Rozszerzenie:
źródło
Dla moich celów, w kontekście kontrolera widoku kontenera, znalazłem to
działa dobrze.
źródło
jeśli korzystasz z UINavigationController, a także chcesz obsługiwać widoki modalne, używam następujących opcji:
źródło
Podejście, które zastosowałem dla modalnego kontrolera widoku, polegało na sprawdzeniu klasy prezentowanego kontrolera. Gdyby prezentowany kontroler widoku był
ViewController2
, to wykonałbym trochę kodu.źródło
Znalazłem te funkcje w
UIViewController.h
.Być może powyższe funkcje mogą wykryć
ViewController
pojawienie się lub nie.źródło
XCode 6.4, dla iOS 8.4, włączony ARC
Oczywiście na wiele sposobów. Ten, który pracował dla mnie, jest następujący ...
Można tego użyć w dowolnym kontrolerze widoku w następujący sposób,
Jeśli wywołasz tę właściwość
-(void)viewDidLoad
, otrzymasz 0, a następnie, jeśli wywołasz ją po-(void)viewDidAppear:(BOOL)animated
otrzymaniu 1.Mam nadzieję, że to komuś pomoże. Dzięki! Twoje zdrowie.
źródło
Jeśli korzystasz z kontrolera nawigacyjnego i chcesz tylko wiedzieć, czy korzystasz z aktywnego i najwyższego kontrolera, użyj:
Ta odpowiedź oparta jest na @mattdipasquale komentarzu .
Jeśli masz bardziej skomplikowany scenariusz, zobacz inne odpowiedzi powyżej.
źródło
możesz to sprawdzić według
window
właściwościźródło
Potrzebowałem tego, aby sprawdzić, czy kontroler widoku jest aktualnie oglądanym kontrolerem, zrobiłem to, sprawdzając, czy jest jakiś przedstawiony kontroler widoku lub przepchnąłem nawigatora, publikuję go na wypadek, gdyby ktoś potrzebował takiego rozwiązania:
źródło
Korzystam z tego małego rozszerzenia w Swift 5 , dzięki czemu można łatwo i łatwo sprawdzić dowolny obiekt będący członkiem UIView .
Następnie używam go jako prostego sprawdzania instrukcji if ...
Mam nadzieję, że to pomoże! :)
źródło