我有这个协议:
protocol MyProtocol:ObservableObject {
var codeDetected:CodeDetected { get set }
var codeDetectedPublished: Published<CodeDetected> { get }
var codeDetectedPublisher: Published<CodeDetected>.Publisher { get }
}
这是检测到的代码
class CodeDetected:ObservableObject {
var title: String
var value:String
init(title:String = "", value:String = ""){
self.title = title
self.value = value
}
}
后来一堂课...
class MyModel: MyProtocol {
@Published var codeDetected:CodeDetected = CodeDetected()
var codeDetectedPublished: Published<CodeDetected> { _codeDetected}
var codeDetectedPublisher: Published<CodeDetected>.Publisher { $codeDetected }
}
问题是改变codeDetected
在此类上,不会触发观察它的结构上的任何内容。
稍后实施
struct MyView: View {
@ObservedObject let myModel = MyModel()
我正在为其设置新值,例如
codeDetected = newCodeDetected
尝试观察你的模型
@StateObject var myModel = MyModel()
没有最小可重复示例 https://stackoverflow.com/help/minimal-reproducible-example我们正在这里分崩离析。
你没有观察title
and value
任何一个。放一个@Published
观察他们,然后以他们自己的方式观察他们View
protocol MyProtocol:ObservableObject {
var codeDetected:CodeDetected { get set }
//var codeDetectedPublished: Published<CodeDetected> { get }
//var codeDetectedPublisher: Published<CodeDetected>.Publisher { get }
}
class CodeDetected:ObservableObject {
@Published var title: String
@Published var value:String
init(title:String = "init", value:String = "init"){
self.title = title
self.value = value
}
}
class MyModel: MyProtocol {
@Published var codeDetected:CodeDetected = CodeDetected()
//var codeDetectedPublished: Published<CodeDetected> { _codeDetected}
//var codeDetectedPublisher: Published<CodeDetected>.Publisher { $codeDetected }
}
struct CodeDetectedView: View {
@StateObject var myModel = MyModel()
var body: some View {
VStack{
//Can't see updates here unless you ask for them/tell the parent model there are changes
Text(myModel.codeDetected.title)
.onReceive(myModel.codeDetected.$title, perform: { _ in
myModel.objectWillChange.send()
})
Text(myModel.codeDetected.value)
.onReceive(myModel.codeDetected.$value, perform: { _ in
myModel.objectWillChange.send()
})
CodeDetectedSubView(codeDetected: myModel.codeDetected)
}
}
}
struct CodeDetectedSubView: View {
@ObservedObject var codeDetected: CodeDetected
var body: some View {
//Can see here
Text(codeDetected.title)
Text(codeDetected.value)
TextField("title", text: $codeDetected.title)
TextField("value", text: $codeDetected.value)
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)