Как получить контроллер root view?
мне нужен экземпляр корневого контроллера представления.
Я пробовал эти подходы:
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
формат Objective-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
}
включены в качестве стандартной функции в:
Swift 3: Chage ViewController без Segue и отправить AnyObject Использование: идентификатор 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)
let view:UIView = UIView()
view.frame = CGRect(x:0, y:0, width:UIApplication.shared.statusBarFrame.width, height:UIApplication.shared.statusBarFrame.height
view.backgroundColor = UIColor.init(named: "yourColor")
UIApplication.shared.keyWindow!.rootViewController?.view.addSubview(view)