发布的视图模型成员值更改时视图上的 SwiftUI 运行 方法

SwiftUI run method on view when Published view model member value changes

我在使用 运行 已发布 属性 值更改的查看方法时遇到问题。我的游乐场示例代码如下所示:

class MyFoo: ObservableObject {
    @Published var bar: String
    init(bar: String) {
        self.bar = bar
    }

    func setNewText(newString: String) {
        self.bar = newString
    }

    func runFunctions() {
        setNewText(newString: "Test")
    }
}

struct TestView: View {
    @ObservedObject let foo = MyFoo(bar: "bar0")

    init(){
        let barSink = foo.$bar
            .sink() { //THIS IS WHERE I GET ERROR "Escaping closure captures mutating 'self' parameter"
                self.printResult(result: [=11=])
            }
    }

    func printResult(result: String) {
        print(result)
    }
}

let a = TestView()

基本上我知道为什么我在关闭时会出现这个错误,但我不知道如何解决它。对于 运行 VM 上发布的 属性 值更改的查看方法,这是正确的方法吗?

我需要这个,因为我使用的自定义微调器还没有准备好 SwiftUI,所以我无法绑定到它,show/hide 的唯一方法是调用它的方法。

任何帮助将不胜感激

我不知道游乐场是如何运作的,但我试着回答你的问题。我在模拟器和真实设备上测试了代码:


class MyFoo: ObservableObject {
    @Published var bar: String
    init(bar: String) {
        self.bar = bar
    }

    func setNewText(newString: String) {
        self.bar = newString
    }

    func runFunctions() {
        setNewText(newString: "Test")
    }


}

struct TestView: View {
    @ObservedObject var foo = MyFoo(bar: "bar0")

    var body: some View {
        Text("Lolz")
            .onReceive(self.foo.$bar, perform: { lolz in
                self.printResult(result: lolz)
            })
    }

    func printResult(result: String) {
        print(result)
    }

}

struct ContentView: View {
    var body: some View {
        TestView()
    }
}

@ObservedObject 需要是 var。使用 onRecieve() 您可以收听发布者并更新 UI 或调用函数。

希望对您有所帮助。