Подтвердить что ты не робот

Как найти корневой UIViewController

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

4b9b3361

Ответ 1

Получить текущий keyWindow:

UIWindow *window = [UIApplication sharedApplication].keyWindow;

Получить свой rootViewController:

UIViewController *rootViewController = window.rootViewController;

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

Вы всегда можете решить эту проблему с помощью 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

Ответ 5

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