在 UIApplication 上调用 -statusBar 或 -statusBarWindow 的应用程序

Posted

技术标签:

【中文标题】在 UIApplication 上调用 -statusBar 或 -statusBarWindow 的应用程序【英文标题】:App called -statusBar or -statusBarWindow on UIApplication 【发布时间】:2020-01-08 02:52:56 【问题描述】:

我正在尝试使用 Xcode 11 beta 6 和 ios 13 beta 8 构建我的应用,但一旦开始运行就会引发此错误:

由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“应用程序在 UIApplication 上调用了 -statusBar 或 -statusBarWindow:此代码必须更改,因为不再有状态栏或状态栏窗口。在窗口场景中使用 statusBarManager 对象。'

什么是窗口场景以及如何使用statusBarManager? 而且我不确定这是否相关,但我没有使用任何SwiftUI

【问题讨论】:

您是否正在更改应用程序中的状态栏颜色或任何属性? @Manav 是的,我改变了状态栏窗口的 alpha 值 【参考方案1】:

您需要添加以下扩展才能访问状态栏视图:

extension UIApplication 
    var statusBarUIView: UIView? 
        if #available(iOS 13.0, *) 
            let tag = 38482458385
            if let statusBar = self.keyWindow?.viewWithTag(tag) 
                return statusBar
             else 
                let statusBarView = UIView(frame: UIApplication.shared.statusBarFrame)
                statusBarView.tag = tag

                self.keyWindow?.addSubview(statusBarView)
                return statusBarView
            
         else 
            if responds(to: Selector(("statusBar"))) 
                return value(forKey: "statusBar") as? UIView
            
        
        return nil
    

【讨论】:

以上代码没有解决问题,应用仍然崩溃,你找到任何可行的解决方案了吗? 我的代码是 guard let statusBar = UIApplication.shared.value(forKeyPath: "statusBarWindow.statusBar") as? UIView else return 。我已经应用了上面的代码guard let statusBar = UIApplication.shared.statusBarUIView else return ,它工作正常。【参考方案2】:

在 Swift 5+ 和 iOS 13+ 中访问 StatusBar

需要将 -satusBar 或 -statusWindow 替换为 statusBarManager

if #available(iOS 13.0, *) 

        let statusBar = UIView(frame: UIApplication.shared.windows.filter $0.isKeyWindow.first?.windowScene?.statusBarManager?.statusBarFrame ?? CGRect.zero)
        statusBar.backgroundColor = .appNavigationThemeColor
          //  statusBar.tag = 100
        UIApplication.shared.windows.filter $0.isKeyWindow.first?.addSubview(statusBar)

     else 

            let statusBar = UIApplication.shared.value(forKeyPath: "statusBarWindow.statusBar") as? UIView
            statusBar?.backgroundColor = .appNavigationThemeColor

        
    

希望会有所帮助:)

【讨论】:

以上是关于在 UIApplication 上调用 -statusBar 或 -statusBarWindow 的应用程序的主要内容,如果未能解决你的问题,请参考以下文章

在调用 UIApplication DidBecomeActiveNotification 时进行区分

未调用 UIApplication WillEnterForegroundNotification

UIApplication DidBecomeActiveNotification 被触发后会调用啥?

使用 UIApplication.shared.open 连续调用多个 URL - 仅先打开

未调用方法:- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceTok

调用扩展 UiApplication 并从 Blackberry 中的主线程实现 Runnable 的类