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

时间:2019-09-05 08:34:01

标签: ios swift uiwindow uistatusbar ios13

我正在尝试使用Xcode 11 beta 6和iOS 13 beta 8构建我的应用程序,但是一旦它开始运行,它将引发此错误:

  

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

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

2 个答案:

答案 0 :(得分:4)

您需要添加以下扩展名以访问statusbarview:

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
    }
}

答案 1 :(得分:0)

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

需要用 statusBarManager 替换-satusBar或-statusWindow。

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

        }
    }

希望会有所帮助:)