在 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