SwiftUI ObservableObject用作EnvironmentObject的奇怪行为

时间:2019-11-26 09:15:30

标签: swiftui combine observableobject

我有ObservableObject,我正在使用environmentObject()注入视图层次结构。

class MenuModel: ObservableObject {

    @Published var selection: Int = 0
    @Published var isMenuOpen: Bool = false

    @Published var tabItems : [TabItem] = [TabItem]()
//    {
//        didSet {
//            objectWillChange.send()
//        }
//    }
    @Published var menuItems : [MenuItem] = [MenuItem]()
//    {
//        didSet {
//            objectWillChange.send()
//        }
//    }

    //var objectWillChange = PassthroughSubject<Void, Never>()
}

以下是我不太了解的问题: 1.上面的代码with可以正常工作,因为所有属性都是@Published。 2.但是如果我将其更改为这样

class Click5MenuModel: ObservableObject {

    @Published var selection: Int = 0
    @Published var isMenuOpen: Bool = false

    var tabItems : [TabItem] = [TabItem]()
    {
        didSet {
            objectWillChange.send()
        }
    }
    var menuItems : [MenuItem] = [MenuItem]()
    {
        didSet {
            objectWillChange.send()
        }
    }

    var objectWillChange = PassthroughSubject<Void, Never>()
}

然后@Published属性停止刷新依赖于此ObservableObject的View! 这是为什么。我还尝试将didSetobjectWillChange.send()添加在一起,但这也会导致某些奇怪的行为,并且代码有些尴尬。

这是否意味着我只能使用仅@Published 仅objectWillChange 方法?

1 个答案:

答案 0 :(得分:1)

默认实现只适用(只要您具有@Published属性)。来自API声明:

/// By default an `ObservableObject` will synthesize an `objectWillChange`
/// publisher that emits before any of its `@Published` properties changes:
...
@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *)
extension ObservableObject where Self.ObjectWillChangePublisher == ObservableObjectPublisher {

    /// A publisher that emits before the object has changed.
    public var objectWillChange: ObservableObjectPublisher { get }
}

因此请删除以下内容:

var objectWillChange = PassthroughSubject<Void, Never>()

并使用

didSet {
    self.objectWillChange.send()
}