【问题标题】:UIApplication.sharedApplication().setStatusBarStyle() deprecated in iOS 9UIApplication.sharedApplication().setStatusBarStyle() 在 iOS 9 中已弃用
【发布时间】:2015-12-06 16:57:43
【问题描述】:

我一直在用

UIApplication.sharedApplication().setStatusBarStyle()

在我的 appDelegate 中,它运行良好,但从 iOS 9 开始,此方法已被弃用,我找不到替代方法。

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

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

有人知道如何为整个应用程序执行此操作吗?

提前致谢

【问题讨论】:

  • 有同样的问题。对于应用程序中的所有视图控制器,我使用BaseViewController 超类,我在其中设置了这种样式。
  • @AlexanderKaraberov 感谢您的评论,我之前正在考虑您的方法,但我不确定这是否是最好的方法,但它似乎是目前最好的选择。
  • 如果您使用的是UINavigationController,那么这里是答案stackoverflow.com/questions/32730211/…

标签: ios xcode swift statusbar ios9


【解决方案1】:

我想我已经找到了解决办法。 我最终设置了

View controller-based status bar appearance 布尔到NO

在我的 info.plist 文件中。

然后我转到目标的General settings -> Deployment info 并更改了下拉选项 Status Bar StyleLight 而不是 Default

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

我希望这会有所帮助!

【讨论】:

  • 所以有两种方法可以做到。执行上述操作并将基于视图控制器的状态栏外观设置为 NO,然后将部署信息设置为亮,或者将基于视图控制器的状态栏外观设置为 YES,并在您的视图控制器中使用 override func preferredStatusBarStyle() -> UIStatusBarStyle { return UIStatusBarStyle.LightContent } 覆盖
  • xcode 7.2 中缺少状态栏样式的下拉菜单。我在哪里可以找到它? @里克?
  • @Rick 我认为这是对的。在这里查看我的截图dropbox.com/s/m40nwswf6wy8uh5/…
  • @SonicMaster 让我看看,我会告诉你的
  • 啊,我想我知道出了什么问题。该下拉列表仅在我将部署信息的目标更改为通用时显示。如果您使用特定目标(ipad/iphone),它就会消失。非常感谢,@Rick
【解决方案2】:

在 Swift 3 中。

在您的视图控制器中:

override var preferredStatusBarStyle: UIStatusBarStyle {
    return UIStatusBarStyle.lightContent
}

如果您希望在应用程序运行时您的启动屏幕在 lightContent 中也有状态栏,那么:

【讨论】:

    【解决方案3】:

    在 Swift 3 中是这样的:

     UIApplication.shared.statusBarStyle = .lightContent
    

    【讨论】:

    • 同一个东西,已弃用
    【解决方案4】:

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

    这也将删除已弃用的警告

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

    打电话

    [[UIApplication sharedApplication] setStatusBarStyle:style];
    

    让我们开始吧

    目标 - 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 为 AnyViewController 设置 UIStatusBarStyle 值:

    Utility.setPreferedStyle(style: .lightContent)
    
    // call below code for preferred style
    preferredStatusBarStyle()
    

    【讨论】:

    • oc 版本根本不工作
    • 这似乎不是一个非常干净的解决方案
    【解决方案5】:

    这在 Xcode 7 中对我来说很好用。

    在 AppDelegate 中:

    UIApplication.sharedApplication().statusBarStyle = .LightContent
    

    【讨论】:

    • 这可行,但在 iOS 9.0 中已弃用。仍然会发出警告,并将在未来的一些 iOS 迭代中停止工作。
    【解决方案6】:

    Swift 5、iOS 13.5+

    我会做一个回顾,希望对你有所帮助。

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

    要回答这个问题,如果我们不想关心异常屏幕并且不按照 Apple 的建议使用视图控制器中的 preferredStatusBarStyle 属性,我认为确实设置了 UIViewControllerBasedStatusBarAppearancefalse 并将General settings -> Deployment info 下的Status Bar Style 更改为光,正如@Rick 已经推荐的那样,是要走的路。

    #2:使用preferredStatusBarStyle

    就我而言,我希望能够将UIStatusBarStyle.lightContent 作为默认值,但在某些屏幕上使用UIStatusBarStyle.default;在这种情况下,解决方案 #1 是不可能的。

    由于还具有对 UIViewController 的一般扩展,允许更改此属性的默认值显然是不可能的,如果我们不想使用已弃用的方法,那么在这些情况下进行的唯一也是最好的方法,是通过继承

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

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

    【讨论】:

      【解决方案7】:

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

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

      override func viewDidLoad() {
          super.viewDidLoad()
      
          var preferredStatusBarStyle: UIStatusBarStyle {
              return .lightContent
          }
      }
      

      【讨论】:

        【解决方案8】:

        这是 AppDelegate 中的新方式:

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

        【讨论】:

        • 如果你在 AppDelegate 中使用它,它仍然会说它已被贬低。
        • 它也被贬低了。
        • 这是一回事
        【解决方案9】:

        在 info.plist 中,设置: View controller-based status bar appearance布尔到NO

        在应用代理的didFinishLaunchingWithOptions 中,使用函数参数application(而不是[UIApplication sharedApplication] 或类似的UIApplication.sharedApplication() 在swift 中)这样设置:

        - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
        {
            application.statusBarStyle = UIStatusBarStyleLightContent;
        }
        

        【讨论】:

        • 对为什么低估这个答案有任何评论吗?它对我有用。
        • 有些用户已经回答了,不建议这样做,因为不推荐直接访问 statusBarStyle 变量。它会向您显示警告,并且将来可能会破坏您的应用程序。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-04
        • 2015-11-24
        • 2020-08-29
        • 1970-01-01
        相关资源
        最近更新 更多