Как найти root UIViewController - PullRequest
33 голосов
/ 11 мая 2011

У меня есть представление UIViewController (root), которое обрабатывает рекламу, и UINavigationController.В этом UINavigationController у меня есть типичные уровни контроллеров.В моем контроллере пользовательских таблиц настроек у меня есть кнопка, чтобы связаться со мной для поддержки.Когда пользователь нажимает эту кнопку, я создаю MFMailComposeViewController и хотел бы представить его.Я не могу представить его в виде таблицы настроек, так как он будет находиться под моей рекламой, поэтому мне нужно сослаться на корневой вид и представить его оттуда.Я пробовал self.parentViewController.parentViewController, где self - это представление таблицы настроек, но это не работает.Как я должен ссылаться на это.Кажется плохим дизайном, когда приходится напрямую ссылаться на корневое представление и передавать его в представление настроек.

Ответы [ 5 ]

79 голосов
/ 11 мая 2011

Получить текущее окно ключа:

UIWindow *window = [UIApplication sharedApplication].keyWindow;

Получите его rootViewController:

UIViewController *rootViewController = window.rootViewController;

ПРИМЕЧАНИЕ : Если в данный момент отображается UIAlertView, создается новое окно, которому назначается ключевое окно. Могут быть и другие исключительные случаи, которые не сохранят окно вашего приложения в качестве ключевого окна.

33 голосов
/ 06 марта 2013

По моему опыту, это идеальное решение для получения rootViewController:

[[[[UIApplication sharedApplication] delegate] window] rootViewController]

Примечание: в случае активного UIAlert или UIActionSheet,вы получаете предупреждение или лист действий в качестве ключевого окна.

2 голосов
/ 11 мая 2011

Используйте приложение Singleton.Что-то вроде:

[[[UIApplication sharedApplication] delegate] rootViewController] должно получить это, если ваш viewController, который является корнем, называется rootViewController

1 голос
/ 25 ноября 2015

Вы всегда можете решить эту проблему с помощью 1 строки кода, но я рекомендую этот способ Swift, вы можете вызывать это из любого места, это также может привести к сбоям и ошибкам:

/// EZSwiftExtensions - Gives you the VC on top so you can easily push your popups
var topMostVC: UIViewController? {
    var presentedVC = UIApplication.sharedApplication().keyWindow?.rootViewController
    while let pVC = presentedVC?.presentedViewController {
        presentedVC = pVC
    }

    if presentedVC == nil {
        print("EZSwiftExtensions Error: You don't have any views set. You may be calling them in viewDidLoad. Try viewDidAppear instead.")
    }
    return presentedVC
}

Включено в качестве стандартной функции в:

https://github.com/goktugyil/EZSwiftExtensions

0 голосов
/ 11 мая 2011

Получить объект UIApplication.Прокрутите массив окон, чтобы найти keyWindow.А затем получите свойство rootViewController.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...