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

wkftcu5l  于 2023-02-09  发布在  Swift
关注(0)|答案(1)|浏览(159)

我在对已发布的属性值更改运行视图方法时遇到了问题。我的Playground示例代码如下所示:

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: $0)
            }
    }

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

let a = TestView()

基本上我知道为什么我在闭包中得到这个错误,但是我不知道如何绕过它。这是在VM发布的属性值改变时运行视图方法的正确方法吗?
我需要这个,因为我使用的是SwiftUI还没有准备好的自定义微调器,所以我不能绑定到它,显示/隐藏它的唯一方法是调用它的方法。
任何帮助都将不胜感激

mrzz3bfm

mrzz3bfm1#

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

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或调用函数。
希望这能帮上忙。

相关问题