@Published 属性不会触发任何东西 [英] @Published property not triggering anything
本文介绍了@Published 属性不会触发任何东西的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有这个协议:
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
不会触发观察它的结构体上的任何东西.
The problem is that changing codeDetected
on this class, does not trigger anything on the structs observing it.
稍后实施
struct MyView: View {
@ObservedObject let myModel = MyModel()
我正在为它设置新值
codeDetected = newCodeDetected
推荐答案
尝试观察模型
@StateObject var myModel = MyModel()
如果没有最小可重现示例,我们将在这里分块进行.
Without a Minimal Reproducible Example we are going in pieces here.
您也没有观察 title
和 value
.在它们上面放一个@Published
,然后在它们自己的View
You aren't observing title
and value
either. put an @Published
on them and then observe them in their own 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)
}
}
这篇关于@Published 属性不会触发任何东西的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文