Nie mogę uzyskać najwyższej pozycji UIViewController
bez dostępu do UINavigationController
. Oto co mam do tej pory:
UIApplication.sharedApplication().keyWindow?.rootViewController?.presentViewController(vc, animated: true, completion: nil)
Wydaje się jednak, że nic nie robi. Wartości keyWindow
i rootViewController
wydają się również wartościami zerowymi, więc opcjonalne tworzenie łańcuchów nie powinno stanowić problemu.
UWAGA: zrobienie czegoś takiego jest kiepskim pomysłem. Łamie wzór MVC.
swift
uiviewcontroller
Zoyt
źródło
źródło
Odpowiedzi:
presentViewController
pokazuje kontroler widoku. Nie zwraca kontrolera widoku. Jeśli nie używaszUINavigationController
, prawdopodobnie szukaszpresentedViewController
i musisz zacząć od katalogu głównego i iterować w dół przez przedstawione widoki.W przypadku Swift 3+:
Dla iOS 13+
źródło
topController.presentedViewController
coś zwraca (tzn. Kontroler ma przedstawiony kontroler potomny). Ma to nawhile let
celu wymuszenie faktu, żetopController.presentedViewController
coś musi zwrócić. Jeśli zwróci zero (tzn. To kontroler nie ma prezentowanych elementów potomnych), przestanie zapętlać. W treści pętli ponownie przypisuje dziecko jako bieżącetopController
i zapętla ponownie, przechodząc w dół hierarchii kontrolera widoku. Może zmienić przypisanie,topController
ponieważ znajduje sięvar
w instrukcji zewnętrznejif
.while let
.if let
Można oczywiście znaleźć wiele przykładów.let x = somethingThatCouldBeNil
Składnia jest bardzo przydatna sztuczka używać gdziekolwiek wartość prawda / stan może być używany. Gdybyśmy go tutaj nie użyli, musielibyśmy jawnie przypisać wartość, a następnie sprawdzić, czy rzeczywiście tam jest. Myślę, że to naprawdę zwięzłe i wyraziste.mieć to rozszerzenie
Swift 2. *
Szybki 3
Możesz użyć tego w dowolnym miejscu na kontrolerze
źródło
return
). Jak może wejść w nieskończoną pętlę?Dla szybkiego 4/5 +, aby uzyskać najwyższy widok kontrolera
Jak używać
źródło
Stosowanie:
źródło
return UIWindow.getVisibleViewControllerFrom(presentedViewController.presentedViewController!)
.presentedViewController.presentedViewController
, czy nie?Na podstawie odpowiedzi Dianza, wersja Objective-C
źródło
Uwielbiałem odpowiedź @ dianz , więc oto jej wersja dla szybkiego 3. To w zasadzie to samo, ale brakowało mu nawiasów klamrowych i niektóre nazwy składni / zmiennych / metod uległy zmianie. Więc oto jest!
Jednak użycie jest nadal takie samo:
źródło
https://gist.github.com/db0company/369bfa43cb84b145dfd8 Zrobiłem kilka testów odpowiedzi i komentarzy na tej stronie. Dla mnie następujące prace
Następnie uzyskaj widok z góryController przez:
źródło
Użyj tego kodu, aby znaleźć najlepsze narzędzie UIViewController
źródło
Niewielka zmiana na @AlberZou przy użyciu obliczonej zmiennej zamiast funkcji
Więc powiedz
źródło
Na podstawie Bob-c powyżej:
Swift 3.0
źródło
Zbyt wiele smaków, ale żaden z nich nie został opracowany iteracyjnie. W połączeniu z poprzednimi:
źródło
możesz zdefiniować zmienną UIViewController w AppDelegate i w każdym viewWillAppear ustaw zmienną na self. (jednak odpowiedź dianz jest najlepszą odpowiedzią).
źródło
Aby znaleźć widoczny kontroler widoku w Swift 3
Ten kod znajduje ostatnio dodany lub ostatni aktywny kontroler widoczny.
Użyłem tego w AppDelegate, aby znaleźć kontroler widoku aktywnego
źródło
źródło
Gdzie umieściłeś kod?
Sprawdziłem twój kod w mojej wersji demo, dowiedziałem się, jeśli umieścisz kod
zawiedzie, ponieważ okno klucza zostało już ustawione.
Ale umieściłem twój kod w kontrolerze widoku
To po prostu działa.
źródło
didFinishLaunchingWithOptions
. Potrzebuję tego tylko do różnych celów debugowania.W bardzo rzadkim przypadku, przy niestandardowym segue, najwyżej umieszczony kontroler widoku nie znajduje się w stosie nawigacji lub kontrolerze paska kart ani nie jest prezentowany, ale jego widok jest wstawiany w górnej części podrzędnych okien widokowych.
W takiej sytuacji konieczne jest sprawdzenie,
UIApplication.shared.keyWindow.subviews.last == self.view
czy bieżący kontroler widoku jest najwyższy.źródło
Dla każdego, kto szuka szybkiego rozwiązania 5 / iOS 13+ (
keywindow
jest przestarzałe od iOS 13)źródło
UIApplication.getTopMostViewController()
wewnątrz twojego ViewController. @ChrisComasźródło
Najlepszym rozwiązaniem dla mnie jest rozszerzenie z funkcją. Utwórz szybki plik z tym rozszerzeniem
Pierwszy to rozszerzenie UIWindow :
wewnątrz tego pliku dodaj funkcję
A jeśli chcesz go użyć, możesz do niego zadzwonić w dowolnym miejscu. Przykład :
Kod pliku wygląda następująco :
źródło