Swift: 仅在一个子视图控制器上隐藏状态栏

Swift: Hide status bar on only one child view controller

关于状态栏和隐藏它我遇到了问题。

设置

我有一个带有滑出式菜单的 BaseViewController。此 BaseViewController 也是应用程序的根控制器 [在 AppDelegate 中设置]:

window = UIWindow()
window?.makeKeyAndVisible()
window?.rootViewController = BaseController()

一旦我 select 一个菜单项,BaseViewController 就会被相应的 ViewController 填充 [在我将其嵌入导航控制器之后]。

菜单项 A:ViewControllerA

菜单项 B:ViewControllerB

菜单项C:ViewControllerC

假设我select菜单项A(以下代码发生在BaseViewController内):

let activeVC = UINavigationController(rootViewController: ViewControllerA())
view.addSubview(activeVC.view)
addChild(activeVC)

当我 select 另一个菜单项(比如 B 项)时,我首先删除之前的活动视图控制器(在本例中为 A 项),然后我以相同的方式添加 ViewControllerB正如我对 ViewControllerA:

所做的那样

这就是我删除以前的活动视图控制器的方式:

activeVC.view.removeFromSuperview()
activeVC.removeFromParent()

分别在每个视图控制器中操作状态栏:

我在 plist 中将 View controller-based status bar appearance 设置为 YES 控制状态栏在每个 view controller 中的外观:

然后我进入ViewController我想隐藏状态栏我添加下面的代码:

override var prefersStatusBarHidden: Bool {
    return true
}

问题

如果我想将状态栏隐藏在 ViewController A、B 或 C 中的任何一个中,我做不到。覆盖 prefersStatusBarHidden 并将其设置为 "true" 将不会执行任何操作。

如果我覆盖 prefersStatusBarHidden 并将其设置为 "true" 到 BaseViewController,则 BaseViewController 以及 ViewController A、B、而C会隐藏状态栏。

我想要的

我希望能够在 ViewControllerB 上隐藏状态栏,而不在其余部分隐藏它。还有一百万美元,但我会解决的!

提前致谢!

您需要为 BaseControllerUINavigationController 覆盖 var childForStatusBarHidden: UIViewController?。例如:

override var childForStatusBarHidden: UIViewController? {
    return children.first
}

extension UINavigationController {

    open override var childForStatusBarHidden: UIViewController? {
        return topViewController
    }
}