当多个连接的场景在前台处于活动状态时获取当前聚焦的 UIScene

fre*_*ing 7 ipad xcode11 swift5.1 uiscene

UIScene当连接多个场景时,我无法获取电流。

具体来说,我的应用程序(iOS 13)支持 iPad 上的多个窗口。当我有两个并排的窗口并访问应用程序连接的场景时(使用UIApplication.shared.connectedScenes),它们都activationState设置为.foregroundActive. 但我实际上只与其中之一互动。

我在 stackoverflow 上找到了一些代码来检索当前的关键窗口(不记得是谁发布的),但正如您所见,它总是会返回两个窗口之一。

let keyWindow: UIWindow? = UIApplication.shared.connectedScenes
    .filter({$0.activationState == .foregroundActive})
    .map({$0 as? UIWindowScene})
    .compactMap({$0})
    .first?.windows
    .filter({$0.isKeyWindow}).first
Run Code Online (Sandbox Code Playgroud)

我是否缺少某些方法来确定与之交互的最后一个窗口,或者多个.foregroundActive状态是否是错误?

谢谢!

Saa*_*afo 10

尽管UIApplication.shared.keyWindow在 iOS 13.0 后被 Apple 弃用,但似乎此属性可以帮助您在前台有多个场景时找到活动的场景,方法是:

UIApplication.shared.keyWindow?.windowScene
Run Code Online (Sandbox Code Playgroud)


fre*_*ing 4

我通过重构代码找到了问题的解决方案,以便现在我可以通过任何视图或视图控制器的属性访问当前UIScene窗口。window这样我就不再需要了keyWindow

我认为两个相邻打开的窗口可能是正确的activationState .foregroundActive

如果有人需要它,这些是帮助我从应用程序中的任何位置访问当前窗口的两个扩展:

extension UIViewController {
  var window: UIWindow? {
    return view.window
  }
}

extension UIScene {
  var window: UIWindow? {
    return (delegate as? SceneDelegate)?.window
  }
}
Run Code Online (Sandbox Code Playgroud)

但如果您无法访问UIView,UIViewController或 ,问题仍然存在UIScene。例如,在不引用视图或场景的数据模型内。然后我没有找到一种方法来一致地访问用户正在交互的正确窗口。

  • 这非常令人沮丧。并排的两个场景都是前景活跃的。实际上,您可以使用两根手指同时与两个场景进行交互。检查窗口是否是关键窗口没有帮助,因为它并不总是最后一个与之交互的窗口。 (2认同)