[英]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.