如何找到root UIViewController

jam*_*one 33 iphone objective-c ipad ios

我有一个视图是UIViewController(根)处理广告和UINavigationController.在那个UINavigationController中,我有典型的控制器层.在我的自定义设置表视图控制器中,我有一个按钮与我联系以获得支持.当用户单击此按钮时,我创建了一个MFMailComposeViewController并希望呈现它.我无法从设置表视图中显示它,因为它将位于我的广告下方,因此我需要引用根视图并从那里显示它.我已经尝试过self.parentViewController.parentViewControllerself是设置表视图,但这不起作用.我应该如何参考.直接引用根视图并将其传递给设置视图似乎是一个糟糕的设计.

Til*_*ill 79

获取当前keyWindow:

UIWindow *window = [UIApplication sharedApplication].keyWindow;
Run Code Online (Sandbox Code Playgroud)

获取它的rootViewController:

UIViewController *rootViewController = window.rootViewController;
Run Code Online (Sandbox Code Playgroud)

注意:如果UIAlertView当前正在显示a,则会创建一个新窗口并将其指定为keyWindow.可能还有其他特殊情况,不会使您的应用程序窗口成为keyWindow.

  • 只是一个快速警告.如果在屏幕上使用ui警报调用它,则无效. (10认同)
  • @ChrisMitchelmore UIAlert打开一个新窗口,只要显示它就会成为关键窗口. (3认同)

Mus*_*afa 33

根据我的经验,这是获得以下方面的理想解决方案rootViewController:

[[[[UIApplication sharedApplication] delegate] window] rootViewController]

注意:如果处于活动状态,UIAlert或者UIActionSheet您将警报或操作表作为关键窗口.

  • 第二个!keyWindow方法(当前标记为正确答案)不可靠,因为关键窗口可以更改. (3认同)