Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 发布的视图模型成员值更改时视图上的SwiftUI运行方法_Ios_Swift_Xcode_Swiftui_Combine - Fatal编程技术网

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

Ios 发布的视图模型成员值更改时视图上的SwiftUI运行方法,ios,swift,xcode,swiftui,combine,Ios,Swift,Xcode,Swiftui,Combine,在发布的属性值更改上运行视图方法时遇到问题。我的示例代码如下所示: class MyFoo: ObservableObject { @Published var bar: String init(bar: String) { self.bar = bar } func setNewText(newString: String) { self.bar = newString } func runFunctions(

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

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,因此无法绑定到它,而显示/隐藏它的唯一方法是调用它的方法


非常感谢您的帮助

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


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
。使用
onreceive()
可以监听发布者并更新UI或调用函数


我希望这有帮助。

尝试在
之前添加
@ObservedObject
让foo=MyFoo(bar:“bar0”)
并使
MyFoo
继承
observeObject
类MyFoo:ObservedObject{}
我已经编辑了这个问题,但它并没有修复那么多错误,不知道这是否是官方的“苹果”解决方案,但它就像一个魅力!!!嗯,
onReceive()
是专门为收听publisher而设计的!)是的,我知道,我指的是添加永远不会用作文本块的文本块,最好创建自定义控件,比如ActionBinder之类的。ActionBinder().onReceive(self.foo.$bar,perform:{p in self.runSomeAction(param:p)})您只需创建一个自定义的
视图
struct customView:View{var body:some视图{Text(“”.onReceive()},您甚至可以在父视图和
onReceive()中执行此操作
客户视图上