Amit Kalra
Amit Kalra

Reputation: 4113

preferredStatusBarStyle removed in Swift 3?

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!

Upvotes: 48

Views: 23056

Answers (2)

rickster
rickster

Reputation: 126127

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.

Upvotes: 146

Imanou Petit
Imanou Petit

Reputation: 92419

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
}

Upvotes: 7

Related Questions