Objective c setStatusBarHidden在iOS 9.0中不推荐使用

Objective c setStatusBarHidden在iOS 9.0中不推荐使用,objective-c,ios9,Objective C,Ios9,我正在将我的代码从iOS 8升级到iOS 9。我的程序中有一个代码片段 [[UIApplication applicationName]setStatusBarHidden:是] 我收到警告“setStatusBarHidden在iOS 9.0中不推荐使用,请使用-[UIViewController prefersStatusBarHidden”。如果我只是将“setStatusBarHidden”替换为“prefersStatusBarHidden”,我会得到“找不到实例方法”。 有人能告诉我

我正在将我的代码从iOS 8升级到iOS 9。我的程序中有一个代码片段
[[UIApplication applicationName]setStatusBarHidden:是]

我收到警告“setStatusBarHidden在iOS 9.0中不推荐使用,请使用-[UIViewController prefersStatusBarHidden”。如果我只是将“setStatusBarHidden”替换为“prefersStatusBarHidden”,我会得到“找不到实例方法”。
有人能告诉我如何解决这个问题吗?

您必须在ViewController.m中添加方法

- (BOOL)prefersStatusBarHidden {

   return NO;
}

将以下代码添加到视图控制器

 - (BOOL)prefersStatusBarHidden {

   return NO;
}
注意:

  • 如果更改此方法的返回值,请调用
    setNeedssStatusBarAppearanceUpdate
    方法
  • 对于childViewController,指定子视图控制器 应控制首选状态栏隐藏/未隐藏状态,执行
    childViewControllerForStatusBarHidden
    方法

    • 这是我的swift代码,用于设置隐藏状态栏和样式

      extension UIViewController {
      
      public var privateStatusBarHidden: Bool {
          return statusBarHidden
      }
      
      public var privateStatusBarStyle: UIStatusBarStyle {
          return statusBarStyle
      }
      
      public func setStatusBarHidden(hidden: Bool, animated: Bool = false) {
          statusBarHidden = hidden
          if animated {
              UIView.animate(withDuration: 0.25, animations: { 
                  self.setNeedsStatusBarAppearanceUpdate()
              })
          } else {
              self.setNeedsStatusBarAppearanceUpdate()
          }
      }
      
      public func setStatusBar(style: UIStatusBarStyle) {
          statusBarStyle = style
          self.setNeedsStatusBarAppearanceUpdate()
      }
      
          public static func swizzleStatusBarHiddenPropertyForViewController() {
          var original = class_getInstanceMethod(UIViewController.self, #selector(getter: UIViewController.prefersStatusBarHidden))
          var changeling = class_getInstanceMethod(UIViewController.self, #selector(getter: UIViewController.privateStatusBarHidden))
          method_exchangeImplementations(original, changeling)
          original = class_getInstanceMethod(UIViewController.self, #selector(getter: UIViewController.preferredStatusBarStyle))
          changeling = class_getInstanceMethod(UIViewController.self, #selector(getter: UIViewController.privateStatusBarStyle))
          method_exchangeImplementations(original, changeling)
      
          original = class_getClassMethod(UIViewController.self, #selector(UIViewController.swizzleStatusBarHiddenPropertyForViewController))
          changeling = class_getClassMethod(UIViewController.self, #selector(UIViewController.emptyFunction))
          method_exchangeImplementations(original, changeling)
      }
      
      @objc private static func emptyFunction() {}
      }
      
      用法
      • 在启动功能中
      UIViewController.swizzleStatusBarHiddenPropertyForViewController()

      • 在UIViewController中隐藏/显示状态栏

      .self.setStatusBar(隐藏:真/假)

      Swift 3.1 Xcode 8.2.1

    • 在info.p中更改列出基于行视图控制器的状态栏外观,并将其设置为“否”

    • 在目标设置中,勾选“隐藏状态栏”


    • 这两个步骤都是必需的,带有Xcode 8.3.3的Swift 3

      1) 在you Info.plist中添加一行。

      2) 在ViewController ViewDidLoad()中,覆盖添加:

       UIApplication.shared.isStatusBarHidden = true
      
      可从iOS 7+获得

      UIViewController
      类中使用此选项

         var isHidden = true{
              didSet{
                  self.setNeedsStatusBarAppearanceUpdate()
              }
          }
          override var prefersStatusBarHidden: Bool {
              return isHidden
          }
      

      如果更改此方法的返回值,请调用 setNeedsStatusBarAppearanceUpdate()方法。指定 视图控制器应控制隐藏/取消隐藏的首选状态栏 状态,实现childViewControllerForStatusBarHidden方法


      prefersStatusBarHidden
      是UIViewController对象的一种方法,而不是UIApplication。因此,您应该在每个UIViewController上设置它。@User196387谢谢。由于我是iOS编程新手,您能告诉我如何在每个UIViewController上设置它吗。“applicationName”是UIApplication类型。这是如何解决方案?preferStatusBarHidden在iOS 9之前就存在。它只能应用于视图控制器,因此如果您想更动态地隐藏或显示状态栏,在iOS 9中如何处理?例如,您将如何根据用户触摸屏幕上的按钮来显示或隐藏状态栏?@PolarBear您可以应用如下逻辑,-(void)touchesBegind:(NSSet*)接触事件:(UIEvent*)事件{shouldHideStatusBar=(shouldHideStatusBar)?否:是;[self-setNeedsStatusBarAppearanceUpdate];}您也可以将此代码添加到您的按钮事件中。@NileshPatel感谢您的帮助。我最终想出了如何用您的想法在我的根控制器上正确更改此代码。再次感谢。有一个提示,请确保添加到您的info.plist“查看基于控制器的状态栏外观”设置为“是”,否则一切似乎都不起作用。如何设置隐藏行为的动画?“isStatusBarHidden”也不赞成这样做。我接下来做的是在info.plist中添加一个名为“基于视图控制器的状态栏…”的属性,并使用布尔值“否”,在项目常规设置中,我将“状态栏类型”更改为“灯光”。