UIApplication.sharedApplication().setStatusBarStyle()在iOS 9中已被弃用。

44

我一直在使用

UIApplication.sharedApplication().setStatusBarStyle()

我的appDelegate里有一个方法,之前一直运作良好。但从iOS 9开始,这个方法已经被弃用,我找不到替代方法。

我想要将整个应用程序的状态栏样式更改为.LightContent,但是xCode给出的唯一建议是在每个VC中单独处理;

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

有人知道如何在整个应用程序中完成这个操作吗?

提前致谢。


1
有同样的问题。在我的应用程序中,我为所有的视图控制器使用BaseViewController超类,在那里我设置了这个样式。 - user1744056
@AlexanderKaraberov 感谢您的评论,我之前考虑过您的方法,但我不确定那是否是最好的方式,但现在看来似乎是最佳选择。 - Rick
如果您正在使用UINavigationController,那么这里是答案:https://dev59.com/UVwY5IYBdhLWcg3wWWm0 - Ashish Kakkad
可能是如何在Swift 3中设置状态栏样式的重复问题。 - Kiran Sarvaiya
9个回答

76

我觉得我找到了一个解决方案。

我最终将View controller-based status bar appearance布尔值设置为NO,在我的info.plist文件中。

Info.Plist

然后我去到我的目标的General settings -> Deployment info并将下拉选项Status Bar StyleDefault改为Light

Change Status Bar Style to Light

这将整个应用程序的状态栏样式更改为Light,正是我想要的。

希望这有所帮助!


2
所以有两种方法可以做到这一点。要么执行上述操作并将“View controller-based status bar appearance”设置为NO,然后将“Deployment Info”设置为light,要么将“View controller-based status bar appearance”设置为YES,并在您的视图控制器中覆盖 `override func preferredStatusBarStyle() -> UIStatusBarStyle { return UIStatusBarStyle.LightContent}`。 - justdan0227
1
Xcode 7.2中缺少状态栏样式的下拉选项。我应该在哪里找到它?@Rick? - Sonic Master
@SonicMaster 让我看一下,我会告诉你。 - Rick
1
啊,我想我知道问题出在哪里了。那个下拉列表只会在我将部署信息的目标更改为Universal时显示。如果使用特定目标(iPad / iPhone),它就会消失。非常感谢你,@Rick。 - Sonic Master
@SonicMaster,现在我明白了,没问题,也谢谢你! - Rick
显示剩余3条评论

11

在 Swift 3 中。

在你的视图控制器中:

override var preferredStatusBarStyle: UIStatusBarStyle {
    return UIStatusBarStyle.lightContent
}

如果您希望应用程序运行时启动屏幕也具有lightContent状态栏,则:

输入图像描述


9

在Swift 3中,它是这样的:

 UIApplication.shared.statusBarStyle = .lightContent

这是同样的事情,已被弃用。 - Alessandro Francucci

3

要在视图控制器上动态更新UIStatusBarStyle,请使用此方法:

这也将删除已弃用的警告

'setStatusBarStyle:'已弃用:首次在iOS 9.0中废弃-请使用-[UIViewController preferredStatusBarStyle]

调用时使用。

[[UIApplication sharedApplication] setStatusBarStyle:style];

让我们开始吧

Objective-C

定义UtilityFunction

+(void)setStatusBarStyle:(UIStatusBarStyle )style {    
    [[NSUserDefaults standardUserDefaults] setInteger:style forKey:@"UIStatusBarStyle"];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

在你的BaseViewController中重写此方法。
- (UIStatusBarStyle)preferredStatusBarStyle {
    UIStatusBarStyle style = [[NSUserDefaults standardUserDefaults] integerForKey:@"UIStatusBarStyle"];
    return style;
}

使用以下的UtilityFunction为AnyViewController设置UIStatusBarStyle值:
[UtilityFunctions setStatusBarStyle:UIStatusBarStyleDefault];

// call below code for preferred style
[self preferredStatusBarStyle];

Swift 4.0

定义UtilityFunction函数

class func setPreferedStyle(style:UIStatusBarStyle)->Void {
    UserDefaults.standard.set(style, forKey: "UIStatusBarStyle")
    UserDefaults.standard.synchronize()
}

在您的BaseViewController中重写此方法。

override var preferredStatusBarStyle: UIStatusBarStyle {
    if let style: UIStatusBarStyle = UIStatusBarStyle(rawValue:UserDefaults.standard.integer(forKey: "UIStatusBarStyle")) {
        return style
    }
    return UIStatusBarStyle.lightContent
}

使用类似下面这样的UtilityFunction设置UIStatusBarStyle值,以适用于AnyViewController:
Utility.setPreferedStyle(style: .lightContent)

// call below code for preferred style
preferredStatusBarStyle()

oc版本完全无法工作。 - user1329261
这似乎不是一个非常干净的解决方案。 - Alessandro Francucci

1

Swift 5, iOS 13.5+

我会做一个总结,希望它能有所帮助。

#1:不使用preferredStatusBarStyle的通用解决方案

回答这个问题,如果我们不想关心异常屏幕,并且不使用Apple建议的视图控制器的preferredStatusBarStyle属性,我认为将UIViewControllerBasedStatusBarAppearance设置为false,并在General settings -> Deployment info下更改Status Bar Style为light,就像@Rick已经建议的那样,是正确的方法。

#2:使用preferredStatusBarStyle

对于我的情况,我希望能够将UIStatusBarStyle.lightContent作为默认值,但是某些屏幕需要UIStatusBarStyle.default;在这种情况下,解决方案#1是不可能的。

由于对于此属性来说,也没有一个通用的扩展可以更改默认值,因此在这种情况下,如果我们不想使用弃用的方法,唯一和最好的方法是通过继承

因此,一种可能性是拥有一个通用的BaseViewController(如果您使用BaseNavigationController,还有BaseNavigationController),您的控制器从中继承,将preferredStatusBarStyle设置为.lightContent

通过这种方法,现在您可以在需要时简单地将样式设置为default,同时保持lightContent作为默认值。


1
这对我在Xcode 7中很有效。
在AppDelegate中:
UIApplication.sharedApplication().statusBarStyle = .LightContent

2
这个可以用,但在iOS 9.0中已经被废弃。它仍会产生警告,并且将在某个未来的iOS版本中停止工作。 - Scooter

0

对于仍在使用Xcode 8中的Swift 3的人:

(与Marlon Ruiz上面的答案略有不同,不是覆盖函数,而是在viewDidLoad内部)

override func viewDidLoad() {
    super.viewDidLoad()

    var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
}

-2
在 info.plist 中设置: View controller-based status bar appearance 布尔值为 NO 在 app delegate 的 didFinishLaunchingWithOptions 中,使用函数参数 application(而不是 [UIApplication sharedApplication] 或类似的 UIApplication.sharedApplication() 在 Swift 中)来进行设置,如下所示:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    application.statusBarStyle = UIStatusBarStyleLightContent;
}

为什么要对这个答案进行负评?它对我有效。 - Despotovic
1
正如一些用户已经回答的那样,这种做法并不推荐,因为直接访问statusBarStyle变量已经被弃用。它会显示警告,并且可能会在未来破坏您的应用程序。 - Chan Jing Hong

-2

这是在AppDelegate中的新方式:

UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)

3
如果您在AppDelegate中使用此代码,它仍会显示为已被弃用。 - justdan0227
它也已被弃用。 - jeet.chanchawat
这是同一件事。 - Mostafa Berg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接