Search code examples
swiftstatusbarreusability

extension for UIViewController is not Working change UIStatusBarStyle In Swift


I am Try to Create extension for UIViewController but Its not working . i am changing status bar color for using extension but i cant get success. But without extension is working. I am new in Extension Please help me. My Aim is I DONT WANT TO CREATE FUNCTION ON EVERY VIEW CONTROLLER , REDUSE REUSABILITY Create Extension Is Not Working

extension UIViewController {

     func preferredStatusBarStyle_change() -> UIStatusBarStyle {
        return UIStatusBarStyle.LightContent
    }
}
//!!!!!!!!!view1
override func viewDidLoad() {
        super.viewDidLoad()
        //preferredStatusBarStyle();
        self.preferredStatusBarStyle_change();
    }
//!!!!!!!!!view2
override func viewDidLoad() {
        super.viewDidLoad()
        //preferredStatusBarStyle();
        self.preferredStatusBarStyle_change();
    }

Without Extension IS Working

View1
override func viewDidLoad() {
                super.viewDidLoad()
                preferredStatusBarStyle();
            }
override func preferredStatusBarStyle() -> UIStatusBarStyle {
            return UIStatusBarStyle.LightContent
        } 
View2

     override func viewDidLoad() {
                super.viewDidLoad()
                preferredStatusBarStyle();
            }

         override func preferredStatusBarStyle() -> UIStatusBarStyle {
                return UIStatusBarStyle.LightContent
            } 

Help me Try to understanding Reusability and extension


Solution

  • It not working because:

    Viewcontroller will call preferredStatusBarStyle() for define about statusbar. Actually you remove preferredStatusBarStyle(); in viewDidload, your controller still work.

    So in your case you can resolve like this:

    You create a subclass of UIViewController maybe name it is: BaseViewController and it this class you put:

    override func preferredStatusBarStyle() -> UIStatusBarStyle {
         return UIStatusBarStyle.LightContent
    } 
    

    And now all your ViewController you inherited from BaseViewController status bar will always .LightContent you don't need put this code above every where.

    Demo: Demo