gpt4 book ai didi

swift - 如何在 SwiftUI 中设置 addObserver?

转载 作者:行者123 更新时间:2023-11-28 13:23:01 27 4
gpt4 key购买 nike

如何在 SwiftUI 中添加 NotificationCenter.default.addObserve

当我尝试添加观察者时出现以下错误

Argument of '#selector' refers to instance method 'VPNDidChangeStatus' that is not exposed to Objective-C

但是当我在 func 前面添加 @objc 时,我得到以下错误

@objc can only be used with members of classes, @objc protocols, and concrete extensions of classes

这是我的代码

let NC = NotificationCenter.default

var body: some View {
VStack() {

}.onAppear {

self.NC.addObserver(self, selector: #selector(self.VPNDidChangeStatus),
name: .NEVPNStatusDidChange, object: nil)

}
}

@objc func VPNDidChangeStatus(_ notification: Notification) {
// print("VPNDidChangeStatus", VPNManager.shared.status)
}

最佳答案

接受的答案可能有效,但实际上并不是您应该如何执行此操作。在 SwiftUI 中,您不需要以这种方式添加观察者。

你添加一个发布者,它仍然可以监听从应用程序的非 SwiftUI 部分触发的 NSNotification 事件,而不需要合并。

这里举个例子,列表会在出现时更新,当它收到通知时,来自另一个 View / Controller 或类似内容的已完成网络请求等。

如果出于某种原因需要触发 @objc 函数,则需要使用 UIViewControllerRepresentable 创建一个 Coordinator

struct YourSwiftUIView: View {

let pub = NotificationCenter.default
.publisher(for: NSNotification.Name("YourNameHere"))


var body: some View {
List() {
ForEach(userData.viewModels) { viewModel in
SomeRow(viewModel: viewModel)
}
}
.onAppear(perform: loadData)
.onReceive(pub) { (output) in
self.loadData()
}
}

func loadData() {
// do stuff
}
}

关于swift - 如何在 SwiftUI 中设置 addObserver?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58818046/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com