preferredStatusBarStyle removed in Swift 3?

23k Views Asked by At

so I recently just updated to Xcode 8 and I just got this error for the following code.

The error is that the method doesn't override any method from it's superclasses.

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

enter image description here

I would really appreciate help, thanks!

2

There are 2 best solutions below

9
On BEST ANSWER

In iOS 10, preferredStatusBarStyle is a property, not a method. So instead of overriding it with a func declaration as you've done, you override the getter with a var declaration:

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

The Swift compiler's error message here could probably be better — since it seems to know your override func is supposed to cover a property, it could probably offer that as a fix-it. I'd recommend filing a bug to Swift open source.


Note: in iOS 12, you may also need to set the UIViewControllerBasedStatusBarAppearance (aka "View controller-based status bar appearance") flag in your Info.plist. And check your view controller hierarchy, as container view controllers like navigation and split view might not propagate this from their children.

2
On

The iOS 10.0 API Diffs shows that the UIViewController.preferredStatusBarStyle() -> UIStatusBarStyle method has been removed and that the UIViewController.preferredStatusBarStyle property has been added.


In a similar way, with Xcode 8, you can right-click on any UIViewController in your code, select Jump to Definition and then perform a search for preferredStatusBarStyle. You will discover that preferredStatusBarStyle now has the following declaration:

@available(iOS 7.0, *)
open var preferredStatusBarStyle: UIStatusBarStyle { get }

Therefore, the following code snippet shows how to override preferredStatusBarStyle with Xcode 8 / Swift 3:

override var preferredStatusBarStyle: UIStatusBarStyle {
    get {
        return .lightContent
    }
}

Or, in a much shorter and preferred style:

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}