@Published 属性不会触发任何东西 [英] @Published property not triggering anything

查看:36
本文介绍了@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.

您也没有观察 titlevalue.在它们上面放一个@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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆