如何获得root视图控制器?

时间:2012-09-14 04:33:29

标签: objective-c swift ios5 uiviewcontroller uinavigationcontroller

我需要一个根视图控制器的实例。

我试过这些方法:

UIViewController *rootViewController = (UIViewController*)[[[UIApplication sharedApplication] keyWindow] rootViewController];

返回: null

当我尝试获得一系列控制器时:

NSArray *viewControllers = self.navigationController.viewControllers;

它只返回一个控制器,但它不是我的根视图控制器。

如果我尝试从导航控制器中取出:

UIViewController *root = (UIViewController*)[self.navigationController.viewControllers objectAtIndex:0];

返回: null

任何想法为什么?我还可以尝试获取根视图控制器的实例吗?

感谢。

9 个答案:

答案 0 :(得分:163)

如果您尝试访问在appDelegate中设置的rootViewController。试试这个:

<强>目标C

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

答案 1 :(得分:34)

以简短的方式访问根视图控制器。

目标C

UIViewController *controller = [UIApplication sharedApplication].keyWindow.rootViewController;

Swift 2.0

let viewController =  UIApplication.sharedApplication().keyWindow?.rootViewController

答案 2 :(得分:16)

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

答案 3 :(得分:10)

根据@ 0x7fffffff的建议here,如果你有UINavigationController,它可以更容易做到:

YourViewController *rootController =
    (YourViewController *)
        [self.navigationController.viewControllers objectAtIndex: 0];

上面的答案中的代码返回UINavigation控制器(如果有的话),如果这是你需要的,你可以使用self.navigationController

答案 4 :(得分:5)

除非你有充分的理由,否则在你的根控制器中执行以下操作:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(onTheEvent:)
                                             name:@"ABCMyEvent"
                                           object:nil];

当你想通知它时:

[[NSNotificationCenter defaultCenter] postNotificationName:@"ABCMyEvent"
                                                object:self];                

答案 5 :(得分:2)

对于 Swift 5 及更高版本,我建议使用这种方法:

UIApplication.shared.windows.last?.rootViewController

使用 .last 将返回顶视图控制器处于活动状态。

.first 有时不适用于需要 top & active 窗口的库。

例如:Admob。我的广告没有显示,并发现我在使用 sheet 或 fullscreenCover 时调用了下面的隐藏窗口。

注意:View要在NavigationView中展示需要的广告,如果没有,广告将不会投放。

示例:NavigationView { View1() }

希望有用。

答案 6 :(得分:1)

Swift 3:Chage ViewController withOut Segue并发送AnyObject 使用:目标ViewController上的标识MainPageViewController

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)  

答案 7 :(得分:0)

Swift 3

let rootViewController = UIApplication.shared.keyWindow?.rootViewController

答案 8 :(得分:0)

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)