Как получить корневой контроллер вида?
мне нужен экземпляр корневого контроллера представления.
Я пробовал эти подходы:
UIViewController *rootViewController = (UIViewController*)[[[UIApplication sharedApplication] keyWindow] rootViewController];
возвращает: null:
также, когда я пытаюсь получить массив контроллеров:
NSArray *viewControllers = self.navigationController.viewControllers;
он возвращает только один контроллер, но это не мой корневой контроллер представления.
Если я попытаюсь взять из навигационного контроллера:
UIViewController *root = (UIViewController*)[self.navigationController.viewControllers objectAtIndex:0];
возвращает: null:
любые идеи, почему? Что еще я мог попробовать чтобы получить экземпляр моего корневого контроллера вида?
спасибо.
9 ответов:
если вы пытаетесь получить доступ к
rootViewController
вы устанавливаете в вашем appDelegate. попробуйте это:С
YourViewController *rootController = (YourViewController*)[[(YourAppDelegate*) [[UIApplication sharedApplication]delegate] window] rootViewController];
Свифт
let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate let viewController = appDelegate.window!.rootViewController as YourViewController
Swift 3
let appDelegate = UIApplication.shared.delegate as! AppDelegate let viewController = appDelegate.window!.rootViewController as! YourViewController
Swift 4
let viewController = UIApplication.shared.keyWindow!.rootViewController as! YourViewController
вкратце путь руки регулятора взгляда корня доступа.
С
UIViewController *controller = [UIApplication sharedApplication].keyWindow.rootViewController;
Swift 2.0
let viewController = UIApplication.sharedApplication().keyWindow?.rootViewController
цель-c формата :
UIViewController *objViewController = [UIApplication sharedApplication].keyWindow.rootViewController;
Swift 2 формат:
let objViewController = UIApplication.sharedApplication().keyWindow?.rootViewController
Swift 3 и 4 формат:
let objViewController = UIApplication.shared.keyWindow?.rootViewController
как и предлагалось здесь по @0x7fffffff, если у вас есть UINavigationController это может быть проще сделать:
YourViewController *rootController = (YourViewController *) [self.navigationController.viewControllers objectAtIndex: 0];
код в ответе выше возвращает UINavigation контроллер (если он у вас есть) и если это то, что вам нужно, вы можете использовать
self.navigationController
.
Если у вас нет веской причины, в вашем корневом контроллере сделайте это:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onTheEvent:) name:@"ABCMyEvent" object:nil];
и когда вы хотите, чтобы уведомить его:
[[NSNotificationCenter defaultCenter] postNotificationName:@"ABCMyEvent" object:self];
быстрый способ сделать это, вы можете вызвать это из любого места, он возвращает необязательный, поэтому следите за этим:
/// 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 }
включены в качестве стандартной функции в:
Свифт 3: Чагэ файле ViewController без подводки и отправить какой-либо объект Использование: Identity MainPageViewController на целевом ViewController
let mainPage = self.storyboard?.instantiateViewController(withIdentifier: "MainPageViewController") as! MainPageViewController var mainPageNav = UINavigationController(rootViewController: mainPage) self.present(mainPageNav, animated: true, completion: nil)
или если вы хотите изменить контроллер вида и отправить данные
let mainPage = self.storyboard?.instantiateViewController(withIdentifier: "MainPageViewController") as! MainPageViewController let dataToSend = "**Any String**" or var ObjectToSend:**AnyObject** mainPage.getData = dataToSend var mainPageNav = UINavigationController(rootViewController: mainPage) self.present(mainPageNav, animated: true, completion: nil)