prefersStatusBarHidden不会被调用

我有一个标准的主要细节的应用程序,我试图有条件地显示/隐藏状态栏。

在MasterViewController中覆盖prefersStatusBarHidden()不会执行任何操作。 它甚至从来没有被调用。

 override func prefersStatusBarHidden() -> Bool { return true } 

在Info.plist中设置UIViewControllerBasedStatusBarAppearance没有帮助,可能是因为YES已经是默认值了。 调用setNeedsStatusBarAppearanceUpdate()也没有帮助。

我的目标是iOS 9。

有一点清洁的解决scheme。 有一个函数childViewControllerForStatusBarHidden是专门devise来返回prefersStatusBarHidden应该转发到的子视图控制器。

所以,重写它会更好。 它看起来像这样:

 override func childViewControllerForStatusBarHidden() -> UIViewController? { if var topViewController = self.viewControllers.first { if let navigationController = topViewController as? UINavigationController { topViewController = navigationController.topViewController! } return topViewController } return super.childViewControllerForStatusBarHidden() } 

也许你甚至可以忽略下面的内容。 NavigationViewController有自己的childViewControllerForStatusBarHidden(),将它发送给子视图控制器。

  if let navigationController = topViewController as? UINavigationController { topViewController = navigationController.topViewController! } 

答案是覆盖从窗口的根视图控制器开始的prefersStatusBarHidden() 。 在主 – 细节应用程序中,这需要UISplitViewController以将消息转发到视图控制器层次结构中。

像这样的东西:

 override func prefersStatusBarHidden() -> Bool { if var topViewController = self.viewControllers.first { if let navigationController = topViewController as? UINavigationController { topViewController = navigationController.topViewController! } return topViewController.prefersStatusBarHidden() } return super.prefersStatusBarHidden() }