且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

SwiftUI视图未更新为EnvironmentObject更改

更新时间:2023-02-12 07:53:48

尝试使用@Published属性. 尝试实现这样的东西:

Try to make use of the @Published property. Try to implement something like this:

class SessionStore : ObservableObject {
    @Published var session: User
}

class User: ObservableObject {
    @Published var uid: String
    @Published var email: String?
    @Published var displayName: String?

    init(uid: String, displayName: String?, email: String?) {
        self.uid = uid
        self.email = email
        self.displayName = displayName
    }

}

当User对象(例如电子邮件或显示名)发生更改时,这应该会更新您的视图,因为它们已发布. 希望这会有所帮助,gl

This should update your view when a change was made in the User object, like the email or displayname because they're Published. Hope this will help, gl

已更新:

由于SwiftUI还不支持嵌套的Observable,因此您需要自己通知主模型.

Because SwiftUI doesn't support nested Observables yet, you need to notify your main model by yourself.

请参见以下代码片段,以了解如何在ObservableObject中使用嵌套的ObservableObject:

See this snippet how to work with a nested ObservableObject inside a ObservableObject:

class Submodel1: ObservableObject {
  @Published var count = 0
}

class Submodel2: ObservableObject {
  @Published var count = 0
}

class Model: ObservableObject {
  @Published var submodel1: Submodel1 = Submodel1()
  @Published var submodel2: Submodel2 = Submodel2()

    var anyCancellable: AnyCancellable? = nil
    var anyCancellable2: AnyCancellable? = nil

    init() {

        anyCancellable = submodel1.objectWillChange.sink { (_) in
            self.objectWillChange.send()
        }

        anyCancellable2 = submodel2.objectWillChange.sink { (_) in
            self.objectWillChange.send()
        }
    }
}

当子模型中的数据更改时,主模型将通知自己.这将导致视图上的更新.

When data inside a submodel changes, the main Model will notify itself. This will result in a update on the view.

让我知道这是否对您有帮助..祝你好运!

Let me know if this helped you out.. Goodluck!