如何使PreferredStatusBarStyle函数

时间:2018-11-17 21:03:14

标签: ios swift xcode

我的应用程序有12个ViewController,我希望每个状态控制器都可以从设置页面更改。 现在,我使用已放入“ CommonFuncs”类中的函数来执行此操作,然后从每个ViewController调用该函数:

CommonFuncs.setStatusBarColor()

使用此已弃用的呼叫:

UIApplication.shared.statusBarStyle = .lightContent

这使我可以通过一次调用从“设置”页面为应用程序中的所有视图设置statusBar。

现在我需要更新和删除不推荐使用的功能,但是替换似乎需要每个ViewController的代码:

override var preferredStatusBarStyle: UIStatusBarStyle {
    if activeForeColorName == "white"{
        return .lightContent
    }else if activeForeColorName == "black"{
        return .default
    }else{
        return .lightContent
    }
}

加上我在viewWillAppear中使用的刷新:

override func viewWillAppear(_ animated: Bool) {
    setNeedsStatusBarAppearanceUpdate()
}

这是一个真正的痛苦,因为需要将相同的代码放入12个单独的ViewController中。

是否有任何方法可以将此代码移至函数中,或使用适用于整个应用程序的另一个状态栏调用?

1 个答案:

答案 0 :(得分:0)

您可以将其移动到UIViewController扩展中,例如

extension UIViewController {
    override var preferredStatusBarStyle: UIStatusBarStyle {
        if Configs.statusBarColor == "black"{
            return .default
        } else {
            return .lightContent
        }
    }

    //swizzle viewWillAppear and viewWillDisappear methods and observe for statusBar color change notifications 

    //...
    //swizzling code here...
    //...       

    func swizzledViewWillAppear(_animated: Bool) {
        self.swizzledViewDidLoad(animated)

        NotificationCenter.default.addObserver(self, selector: #selector(updateStatusBarAppearance), name: NSNotification.Name("updateStatusBarColorNotification"), object: nil)
    }

    func swizzledViewWillDisappear(_animated: Bool) {
        swizzledViewWillDisappear(animated)
        NotificationCenter.default.removeObserver(self)
    }

    @objc func updateStatusBarAppearance() {
        setNeedsStatusBarAppearanceUpdate()
    }    
}

然后,只要您更改updateStatusBarColorNotification(或您的情况下为activeForeColorName),便会发布名称为Configs.statusBarColor的通知