Swift/iOS13 - 在 ViewController 中访问 SceneDelegate 窗口变量

kir*_*net 13 ios swift ios13

是否可以从 ViewController 中的 SceneDelegate 访问窗口变量?基本上我需要一个替代方案,UIApplication.shared.delegate.window但找不到任何东西

Moj*_*ini 23

更新

iOS 13 开始,应用程序可以有多个活动窗口,因此您需要访问所需的窗口。所以你可以访问任何View这样的窗口:

self.view.window
Run Code Online (Sandbox Code Playgroud)

如果你真的想访问UISceneDelegate你可以像这样访问它:

self.view.window.windowScene.delegate
Run Code Online (Sandbox Code Playgroud)

旧:不推荐:

假设

  1. 只有一个场景代表。
  2. 只有一个场景和一个窗口。
  3. 应用程序中的所有视图控制器都是该场景及其窗口的一部分。

您可以SceneDelegate像这样实现一个辅助变量:

private(set) static var shared: SceneDelegate?

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

    guard let _ = (scene as? UIWindowScene) else { return }
    Self.shared = self
}
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样在任何地方访问它:

SceneDelegate.shared?.window // or anything else
Run Code Online (Sandbox Code Playgroud)

  • `SceneDelegate.shared?.window` 仅当您只有一个对于场景来说不自然的场景时才很酷 (2认同)