Ios 首选StatusBarHidden isn';我没接到电话

Ios 首选StatusBarHidden isn';我没接到电话,ios,uinavigationcontroller,uisplitviewcontroller,Ios,Uinavigationcontroller,Uisplitviewcontroller,我有一个标准的Master-Detail应用程序,我正在尝试有条件地显示/隐藏状态栏 在MasterViewController中重写prefersStatusBarHidden(),没有任何作用。它甚至从未被呼叫过 override func prefersStatusBarHidden() -> Bool { return true } 在Info.plist中设置UIViewControllerBasedStatusBarAppearance,可能没有帮助,因为YES已经是

我有一个标准的Master-Detail应用程序,我正在尝试有条件地显示/隐藏状态栏

在MasterViewController中重写
prefersStatusBarHidden()
,没有任何作用。它甚至从未被呼叫过

override func prefersStatusBarHidden() -> Bool {
    return true
}
在Info.plist中设置
UIViewControllerBasedStatusBarAppearance
,可能没有帮助,因为
YES
已经是默认值。调用
setNeedsStatusBarAppearanceUpdate()
也没有帮助


我的目标是iOS 9。

答案是从窗口的根视图控制器开始覆盖
首选StatusBarHidden()
。在Master Detail应用程序中,这需要子类化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()
}
override func childViewControllerForStatusBarHidden() -> UIViewController? {
    if var topViewController = self.viewControllers.first {
        if let navigationController = topViewController as? UINavigationController {
            topViewController = navigationController.topViewController!
        }
        return topViewController
    }

    return super.childViewControllerForStatusBarHidden()
}

有一个稍微干净一点的解决方案。有一个函数
childViewControllerForStatusBarHidden
,专门用于返回应转发prefersStatusBarHidden的子视图控制器

因此,最好覆盖它。它将如下所示:

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()
}
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(),它会将其发送给子viewcontroller

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

如果对所有拆分视图控制器都适用,那么这对我很有用:

extension UISplitViewController {
    override open var childForStatusBarHidden: UIViewController? {
        return (viewControllers.last as? UINavigationController)?.visibleViewController
}
}