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()中执行此操作
在客户视图上