swiftui - 更改为 @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 var
insideMasterView
和一个@Binding var
inside ,它也可以工作Modal
。它只是不适用于此设置。
解决方案
有几件事。
- 如果您将 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()
}
}
}
我测试了一些东西并且它有效。
推荐阅读
- django - 表格不允许在 django 中创建和编辑
- c++ - 如何将 std::vector 项与 std::map 的关键元素进行比较
- javascript - 选择另一张图片时,Js/Jquery如何删除以前的图片缩略图?
- security - 我的 Flask 会话 cookie 安全吗?所有页面/视图和表单上的相同 csrf_token
- nopcommerce - 如何在 NopCommerce 插件中添加自定义产品模板
- c - 使用递归在 C 中合并排序
- javascript - 在Swiper中按住按钮实现连续移动幻灯片(Reactjs)
- javascript - 以编程方式在动态添加的元素上触发 JQuery 事件
- gradle - 配置插件任务
- sql - 审计表和外键