Кажется, я не могу получить самый верх UIViewController
без доступа к UINavigationController
. Вот что у меня так далеко:
UIApplication.sharedApplication().keyWindow?.rootViewController?.presentViewController(vc, animated: true, completion: nil)
Однако, похоже, ничего не делает. keyWindow
И , как rootViewController
представляется, не-нильполугруппа значения тоже, так что дополнительное сцепление не должно быть проблемой.
ПРИМЕЧАНИЕ. Плохо делать что-то подобное. Это нарушает схему MVC.
Ответы:
presentViewController
показывает контроллер вида. Это не возвращает контроллер представления. Если вы не используетеUINavigationController
, вы, вероятно, ищете,presentedViewController
и вам нужно начать с корня и пройти вниз по представленным представлениям.Для Swift 3+:
Для iOS 13+
источник
topController.presentedViewController
что-то возвращает (т. Е. Контроллер имеет представленный дочерний контроллер). Это для того,while let
чтобы усилить тот факт, чтоtopController.presentedViewController
должен что-то вернуть Если он возвращает ноль (то есть, это контроллер не имеет представленных потомков), то он прекращает цикл. В теле цикла он переназначает дочерний элемент как текущийtopController
и повторяет цикл, спускаясь вниз по иерархии контроллера представления. Он может быть переназначенtopController
какvar
во внешнемif
утверждении.while let
. Есть, конечно, многоif let
примеров, которые можно найти.let x = somethingThatCouldBeNil
Синтаксис супер удобный трюк , чтобы использовать везде , где значение истины / условие может быть использовано. Если бы мы не использовали его здесь, нам пришлось бы явно назначить значение, а затем проверить, есть ли оно на самом деле. Я думаю, что это действительно лаконично и выразительно.есть это расширение
Swift 2. *
Swift 3
Вы можете использовать это в любом месте на вашем контроллере
источник
return
). Как это может войти в бесконечный цикл?Для быстрого 4/5 +, чтобы получить самый верхний viewController
Как пользоваться
источник
Использование:
источник
return UIWindow.getVisibleViewControllerFrom(presentedViewController.presentedViewController!)
.presentedViewController.presentedViewController
, или нет?Основываясь на ответе Dianz, версия Objective-C
источник
Мне понравился ответ @ dianz , и вот его версия Swift 3. Это в основном то же самое, но ему не хватало фигурной скобки, и некоторые имена синтаксиса / переменных / методов изменились. Так что вот оно!
Использование остается прежним, хотя:
источник
https://gist.github.com/db0company/369bfa43cb84b145dfd8 Я провел несколько тестов на ответы и комментарии на этом сайте. Для меня следующие работы
Затем получите верхний viewController по:
источник
Используйте этот код, чтобы найти самый верхний UIViewController
источник
Небольшое изменение @AlberZou с использованием вычисляемой переменной, а не функции
Тогда скажи
источник
На основании Боба -c выше:
Swift 3.0
источник
Слишком много ароматов, но нет итеративно разработанного. В сочетании с предыдущими:
источник
Вы можете определить переменную UIViewController в AppDelegate, и в каждом viewWillAppear установите для переменной значение self (однако dianz-ответ - лучший ответ).
источник
Чтобы найти видимый viewController в Swift 3
Этот код находит последний добавленный или последний видимый активный контроллер.
Это я использовал в AppDelegate, чтобы найти активный контроллер представления
источник
источник
Где вы положили код?
Я попробую ваш код в моей демонстрации, я узнал, если вы поместите код в
потерпит неудачу, потому что окно ключа было установлено еще.
Но я поместил ваш код в некоторые контроллеры представления
Это просто работает.
источник
didFinishLaunchingWithOptions
. Мне просто нужно это для различных целей отладки.В очень редком случае, с пользовательским переходом, самый верхний контроллер представления не находится в стеке навигации или контроллере панели вкладок или не представлен, но его представление вставляется в верхнюю часть подпредставлений ключевых ветров.
В такой ситуации необходимо проверить,
UIApplication.shared.keyWindow.subviews.last == self.view
чтобы определить, является ли текущий контроллер представления самым верхним.источник
Для тех, кто ищет быстрое решение 5 / iOS 13+ (
keywindow
устарело с iOS 13)источник
UIApplication.getTopMostViewController()
внутри вашего ViewController. @ChrisComasисточник
Лучшее решение для меня - это расширение с функцией. Создайте файл swift с этим расширением
Во-первых, это расширение UIWindow :
внутри этого файла добавить функцию
И если вы хотите использовать его, вы можете позвонить куда угодно. Пример :
Код файла выглядит так :
источник