Как получить контроллер 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
}

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

https://github.com/goktugyil/EZSwiftExtensions


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)  

Swift 3

let rootViewController = UIApplication.shared.keyWindow?.rootViewController


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)