首页 > 解决方案 > 更改为 @EnvironmentObject 中的 @Published var 不会立即反映

问题描述

在这种特定情况下,当我尝试更改@EnvironmentObject's@Published var时,我发现视图没有失效并立即更新。相反,对变量的更改仅在离开模态并返回后才会反映出来。

import SwiftUI

final class UserData: NSObject, ObservableObject  {
    @Published var changeView: Bool = false
}

struct MasterView: View {
    @EnvironmentObject var userData: UserData
    @State var showModal: Bool = false

    var body: some View {
        Button(action: { self.showModal.toggle() }) {
            Text("Open Modal")
        }.sheet(isPresented: $showModal, content: {
            Modal(showModal: self.$showModal)
                .environmentObject(self.userData)
        } )
    }
}

struct Modal: View {
    @EnvironmentObject var userData: UserData
    @Binding var showModal: Bool

    var body: some View {
        VStack {
            if userData.changeView {
                Text("The view has changed")
            } else {
                Button(action: { self.userData.changeView.toggle() }) {
                    Text("Change View")
                }
            }
        }
    }
}



#if DEBUG
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        MasterView().environmentObject(UserData())
    }
}
#endif

仅在模态关闭后显示视图更改的视频

这是一个错误还是我做错了什么?

如果changeView@State var内部模态,则此方法有效。如果它是一个@State varinsideMasterView和一个@Binding varinside ,它也可以工作Modal。它只是不适用于此设置。

标签: swiftui

解决方案


有几件事。

  • 如果您将 Button 移入其中,您的设置将不起作用MasterView
  • 您的代码中没有 a import Combine(别担心,仅此一项没有帮助)。

这是修复。我不知道这是一个错误,还是只是糟糕的文档 - IIRC 它指出这objectWillChange是隐含的。

除了添加import Combine到您的代码中,将您的更改UserData为:

final class UserData: NSObject, ObservableObject  {
    var objectWillChange = PassthroughSubject<Void, Never>()
    @Published var changeView: Bool = false {
        willSet {
            objectWillChange.send()
        }
    }
}

我测试了一些东西并且它有效。


推荐阅读