Fab*_*oft 7 xcode ios13 uiscenedelegate uiscene
我正在将适用于 iPadOS 的 iOS13 应用程序转换为 SceneDelegate(多窗口)。
如何从当前的 SceneDelegate 获取当前的 UIWindow?
我知道 a 可以使用UIView.windowor访问当前场景UIViewController.view.window,但是我有一个非 UI 类(AppDelegate),我需要在其中获取窗口(iOS12 之前的 keyWindow)以在所有内容的顶部显示小吃吧。
我曾经这样做,[UIApplication sharedApplication].keyWindow但现在,当然,这是错误的。
Ale*_*ano 10
受到许多解决方案的启发,为了找回我的旧窗口属性(在 connectedScenes 中搜索它),我实现了一个小扩展:
extension UIApplication {
var currentWindow: UIWindow? {
connectedScenes
.filter({$0.activationState == .foregroundActive})
.map({$0 as? UIWindowScene})
.compactMap({$0})
.first?.windows
.filter({$0.isKeyWindow}).first
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
if let window = UIApplication.shared.currentWindow {
// do whatever you want with window
}
Run Code Online (Sandbox Code Playgroud)
您需要简单地遍历所有窗口并手动找到关键窗口。
for (UIWindow *window in [UIApplication sharedApplication].windows) {
if (window.isKeyWindow) {
// you have the key window
break;
}
}
Run Code Online (Sandbox Code Playgroud)
不要使用UISceneActivationStateForegroundActive作为检查。这意味着一些不同的东西,人们通过使用逻辑来找到第一个UISceneActivationStateForegroundActive窗口场景来引入错误。
Gab*_*abe -2
我还没有尝试过这一点,但您应该能够获取所有窗口[UIApplication sharedApplication].windows,然后选择是否要在所有窗口或一个窗口上显示小吃栏。
| 归档时间: |
|
| 查看次数: |
6621 次 |
| 最近记录: |