SwiftUI@ObservedBect未更新
我有一个内容视图,其中显示或不显示基于从Firebase RemoteConfig获取的布尔值的文本。我试图在SecondView上传递布尔值,我希望它在ContentView上的布尔值更新时自己更新SwiftUI@ObservedBect未更新,swiftui,firebase-remote-config,Swiftui,Firebase Remote Config,我有一个内容视图,其中显示或不显示基于从Firebase RemoteConfig获取的布尔值的文本。我试图在SecondView上传递布尔值,我希望它在ContentView上的布尔值更新时自己更新 class GlobalString: ObservableObject { @Published var isHidden = true } struct ContentView: View { @ObservedObject var globalString = Global
class GlobalString: ObservableObject {
@Published var isHidden = true
}
struct ContentView: View {
@ObservedObject var globalString = GlobalString()
func updateUI(newUI: Bool) {
if newUI {
globalString.isHidden = false
}
else {
globalString.isHidden = true
}
}
func fetchValues() {
let value = self.remoteConfig.configValue(forKey: "show_boost").boolValue
updateUI(newUI: value)
}
init() {
fetchValues()
}
var body: some View {
if !globalString.isHidden {
Text("Not Hidden")
else {
Text("Hidden")
}
}
}
问题是,当我(通过RemoteConfig)更改ContentView上的布尔值时,SecondView中的布尔值没有更新。我不知道为什么
struct SecondView: View {
@ObservedObject var globalString = GlobalString()
var body: some View {
VStack {
if globalString.isHidden {
Text("Hidden")
else {
Text("Not Hidden")
}
}
}
}
}
每个
@ObservedObject var globalString=globalString()
都是全局模型的单独实例
一个人看不见另一个人在做什么
class GlobalString: ObservableObject {
@Published var isHidden = true
init() {
fetchValues()
}
//This kind of stuff shouldn't be in a View it can't be shared/reused.
func fetchValues() {
let value = self.remoteConfig.configValue(forKey: "show_boost").boolValue
updateUI(newUI: value)
}
func updateUI(newUI: Bool) {
if newUI {
self.isHidden = false
}
else {
self.isHidden = true
}
}
}
struct SampleUpdateParentView: View {
//@ObservedObject is for when then instance is initialized in another View
@StateObject var globalString = GlobalString()
var body: some View {
//This is how you share an instance
SampleUpdateView().environmentObject(globalString)
SecondView().environmentObject(globalString)
}
}
struct SampleUpdateView: View {
@EnvironmentObject var globalString: GlobalString
var body: some View {
if !globalString.isHidden {
Text("Not Hidden")
}else {
Text("Hidden")
}
}
}
struct SecondView: View {
@EnvironmentObject var globalString: GlobalString
var body: some View {
VStack {
if globalString.isHidden {
Text("Hidden")
}else {
Text("Not Hidden")
}
}
}
}
您也可以使用单例(不太推荐),只需在类GlobalString
中更改/替换init
static let shared = GlobalString()
private init() {
fetchValues()
}
并将实例更改为引用shared
变量
@StateObject var globalString = GlobalString.shared
将您的
@observedbjec
t更改为@StateObject
谢谢您的回答。当我尝试您的代码时,出现以下错误:“线程1:致命错误:找不到GlobalString类型的ObservableObject。GlobalString的View.environmentObject(:)可能作为此视图的祖先丢失。”您必须使用.environmentObject(GlobalString)将其传递到下一行
就像在SampleUpdateParentView
中一样,如果在不添加环境对象初始值设定项的情况下初始化SampleUpdateView()
或SecondView()
而初始化SampleUpdateView()。在这种情况下,Singleton是您的最佳选择。请参阅代码以了解您需要进行的更改。