在这种特定情况下,当我尝试更改@EnvironmentObject
的时@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
Run Code Online (Sandbox Code Playgroud)
这是一个错误还是我做错了什么?
如果changeView
是@State var
内部模式,则此方法有效。它也可以,如果它是一个@State var
内MasterView
有一个@Binding var
内Modal
。它不适用于此设置。
有几件事。
MasterView
到任一位置,则设置将不起作用。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()
}
}
}
Run Code Online (Sandbox Code Playgroud)
我测试了东西,它起作用了。
改变
final class UserData: NSObject, ObservableObject {
Run Code Online (Sandbox Code Playgroud)
到
final class UserData: ObservableObject {
Run Code Online (Sandbox Code Playgroud)
确实修复了 Xcode11 Beta6 中的问题。SwiftUI 似乎确实无法正确处理NSObject
子类的实现(至少它看起来ObservableObject
不会调用它的内部块)。willSet
归档时间: |
|
查看次数: |
674 次 |
最近记录: |