我需要一个根视图控制器的实例。
我试过这些方法:
UIViewController *rootViewController = (UIViewController*)[[[UIApplication sharedApplication] keyWindow] rootViewController];
返回: null :
当我尝试获得一系列控制器时:
NSArray *viewControllers = self.navigationController.viewControllers;
它只返回一个控制器,但它不是我的根视图控制器。
如果我尝试从导航控制器中取出:
UIViewController *root = (UIViewController*)[self.navigationController.viewControllers objectAtIndex:0];
返回: null :
任何想法为什么?我还可以尝试获取根视图控制器的实例吗?
感谢。
答案 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)