我正在将我的用于iPadOS的iOS13应用程序转换为SceneDelegate (多窗口)。
如何从当前SceneDelegate获取当前UIWindow?
我知道可以使用UIView.window
或UIViewController.view.window
访问当前场景,但我有一个非UI类(AppDelegate),在这个类中,我需要让窗口(keyWindow到iOS12)在所有内容之上显示一个快餐栏。
我曾经做过[UIApplication sharedApplication].keyWindow
,但现在,当然,那是错误的。
发布于 2019-11-03 01:31:14
Swift 5.x / iOS 13.x
受许多解决方案的启发,为了找回我的旧窗口属性(在connectedScenes中搜索它),我实现了一个小小的扩展:
extension UIApplication {
var currentWindow: UIWindow? {
connectedScenes
.filter({$0.activationState == .foregroundActive})
.map({$0 as? UIWindowScene})
.compactMap({$0})
.first?.windows
.filter({$0.isKeyWindow}).first
}
}
使用
if let window = UIApplication.shared.currentWindow {
// do whatever you want with window
}
发布于 2019-09-18 00:23:21
您需要简单地遍历所有窗口并手动查找key窗口。
for (UIWindow *window in [UIApplication sharedApplication].windows) {
if (window.isKeyWindow) {
// you have the key window
break;
}
}
不要使用UISceneActivationStateForegroundActive
作为检查。这意味着一些不同的东西,人们通过使用逻辑来找到第一个UISceneActivationStateForegroundActive
窗口场景来引入错误。
发布于 2019-08-30 12:07:18
听起来你可能想把这个逻辑转移到你的SceneDelegate上。
SceneDelegate现在知道窗口是否连接到场景,因此让每个连接的场景监听驱动小吃店的事件,并在窗口上显示它可能是有意义的。这将导致每个可见窗口都显示快餐店(1个或更多)。
https://stackoverflow.com/questions/57009283
复制相似问题