繁体   English   中英

swiftUI 从远程关闭修改 state var

[英]swiftUI modify state var from remote closure

我有一个用 swift/swiftUI 编写的应用程序。

由事件生成器组成的逻辑部分,使客户端能够在 UI 部分启动之前为每个事件注册一个回调。

init.swift
-----------

func applicationDidFinishLaunching(_ aNotification: Notification) {

    let event1Handler : eventHandler = {(data) in
        ContentView().alert_handler.showAlert = true
    }
    let event2Handler : eventHandler = {(data) in
        ...
    }

    eventGenerator.sharedInstance().registerUIEvent1(event1Handler, event2: event2Handler)

    window = NSWindow(...)
    window.contentView = NSHostingView(rootView: ContentView())
...
}

在 UI 部分,有一个可选的警报,它依赖于showAlert可以从上一个文件的闭包中设置...

class alertHandler: ObservableObject {
    @Published var showAlert = false
}

struct ContentView: View {
     @ObservedObject var alert_handler = alertHandler()
     var body: some View {
         GeometryReader { metrics in
         .....
         }.alert(isPresented: $alert_handler.showAlert, content: {
            Alert(title: Text("Alert:"),
                    message: Text("press OK to execute default action..."),
                    dismissButton: Alert.Button.default(
                          Text("Press ok here"), action: { print("Hello world!") }
          )
      )
    })

不幸的是,当第一个事件被触发时,我看不到警报出现。 也许有人可以告诉我我是否做错了什么? 或建议一种替代方法来从远程关闭修改 swiftUI 结构变量(event_handler)?

我相信我的问题可能来自不是 singleton 的 ContentView 模块,所以当我设置 showAlert 时,我正在为 ContentView 的另一个实例这样做。 如何修复我的代码以访问属于当前运行的 ContentView 实例的 showAlert?

您对ContentView不是 singleton 实例的怀疑是正确的。 您可以通过在父级(在本例中为应用程序委托)中拥有您的alertHandler并将其传递给ContentView来解决此问题。

var handler = alertHandler()

func applicationDidFinishLaunching(_ aNotification: Notification) {

    let event1Handler : eventHandler = { (data) in
        self.handler.showAlert = true //<-- Here
    }
    let event2Handler : eventHandler = {(data) in
        ...
    }

    eventGenerator.sharedInstance().registerUIEvent1(event1Handler, event2: event2Handler)

    window = NSWindow(...)
    window.contentView = NSHostingView(rootView: ContentView(alert_handler: handler))
...
}
struct ContentView: View {
     @ObservedObject var alert_handler : alertHandler //<-- Here

这样,当您修改showAlert属性时, ContentView会更新,因为它是alertHandler同一个实例

注意:我会考虑采用 Swift 约定大写类型名称并使用驼峰式大小写而不是蛇形大小写——这将使其他人更容易阅读您的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM