У меня есть представление UIViewController
(root), которое обрабатывает объявления и UINavigationController
. В этом UINavigationController у меня есть типичные уровни контроллеров. В моем контроллере табличного представления пользовательских настроек у меня есть кнопка, чтобы связаться со мной для поддержки. Когда пользователь нажимает эту кнопку, я создаю MFMailComposeViewController
и хочу ее представить. Я не могу представить его из представления таблицы настроек, так как он будет находиться под моими объявлениями, поэтому мне нужно обратиться к корневому представлению и представить его оттуда. Я пробовал self.parentViewController.parentViewController
, где self - это представление таблицы настроек, но это не работает. Как я должен ссылаться на это. Похоже, что плохой дизайн должен напрямую ссылаться на корневой вид и передавать его в представление настроек.
Как найти корневой UIViewController
Ответ 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
}
Он включен как стандартная функция в:
Ответ 5
Получить объект UIApplication. Цикл через массив окон, чтобы найти keyWindow. И затем получите свойство rootViewController.