问题:如何从SceneDelegate调用SwiftUI视图结构方法

时间:2019-11-01 14:54:38

标签: swiftui

目前我是一个不明白的人。

问题:

尝试从场景委托连接到视图方法,例如:

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
  var window: UIWindow?

  ...

  func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
    // guard let contentView = ???? as? ContentView else { return }
    // contentView.callMethod(parameter: true)
  }
}
struct ContentView: View {    
  var body: some View {
    ...
  }

  func callMethode(parameter: Bool) {
    print("called")
  }
}

有什么线索如何连接到视图并在两者之间调用方法?

thx 乔

2 个答案:

答案 0 :(得分:0)

这与SwiftUI框架的设计背道而驰。您不应具有任何持久视图来调用方法。取而代之的是,根据应用的状态更改创建视图并根据需要显示视图。

例如,如果您的SceneDelegate引用了模型类的实例,并且您的视图依赖于该模型,则可以在scene(_:continue :)中修改模型,并且视图将自动更新。

如果您可以提供有关您要执行的操作的更多详细信息,我也许可以给出更具体的答案。

答案 1 :(得分:0)

非常感谢。完全理解...将阅读文档...

这是一个可能的例子吗?

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?
    let activity = UserActivityManager()

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

        if let windowScene = scene as? UIWindowScene {
            let window = UIWindow(windowScene: windowScene)
            window.rootViewController = UIHostingController(rootView: contentView.environmentObject(activity))
            self.window = window
            window.makeKeyAndVisible()

            if let userActvity = connectionOptions.userActivities.first {
                guard let title = userActvity.title else { return }
                activity.doAction(action: title)
            }
        }
    }

    func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
        guard let title = userActivity.title else { return }
        activity.doAction(action: title)
    }
}