繁体   English   中英

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

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

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

let a = TestView()

基本上我知道为什么我在关闭时收到此错误,但我不知道如何围绕它进行 go。 这是在 VM 发布的属性值更改上运行视图方法的正确方法吗?

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

非常感激任何的帮助

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


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 或调用 function。

我希望这有帮助。

暂无
暂无

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

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