iOS Swiftui应用程序返回前台重置观测对象

iOS Swiftui应用程序返回前台重置观测对象,ios,swift,swiftui,Ios,Swift,Swiftui,我有一个应用程序,它使用ObservedObject在各种视图中共享数据 定义viewmodel 类MyViewModel:ObserveObject{ @发布的var语言:String? } 现在来看ContentView struct ContentView:View{ @ObservedObject私有变量myViewModel=myViewModel() var body:一些观点{ Home() .environmentObject(self.myViewModel) } } 这里

我有一个应用程序,它使用ObservedObject在各种视图中共享数据

定义viewmodel

类MyViewModel:ObserveObject{
@发布的var语言:String?
}
现在来看ContentView

struct ContentView:View{
@ObservedObject私有变量myViewModel=myViewModel()
var body:一些观点{
Home()
.environmentObject(self.myViewModel)
}
}
这里是家

struct Home:视图{
@环境对象变量myViewModel:myViewModel
var body:一些观点{
VStack{
文本(self.myViewModel.language???)
.onReceive(self.myViewModel.$language,执行:{language in
印刷品(语文)
})
按钮(操作:{
self.myViewModel.language=“美国英语”
},标签:{
文本(“设置语言”)
})
}
}
}
onReceive
此处用于调试目的

单击按钮将语言设置为“美式英语”,文本()将显示更新的字符串

现在将应用程序置于后台,然后单击图标将其调回前台:尽管UI上没有任何更改,但myviewmodel为零

为了“恢复”状态,我修改了ContentView以接收“前台通知”,如下所示

struct ContentView:View{
@ObservedObject私有变量myViewModel=myViewModel()
var body:一些观点{
Home()
.environmentObject(self.myViewModel)
.onReceive(NotificationCenter.default.publisher(for:UIApplication.willEnterForegroundNotification)){in
self.myViewModel.language=“美国英语”
}
}
}
Home()的onReceive中的debug print可以工作并显示正确的字符串,但是
Text()
中的字符串将消失,就好像它接收到nil值并且没有后续刷新一样

有什么想法吗

编辑
必须保持IOS 13兼容性

改用
StateObject

struct ContentView: View {
    @StateObject private var myViewModel = MyViewModel()

...

我是个十足的白痴,忘了提我需要保持IOS 13的兼容性。还编辑了问题。抱歉@asperit然后在
ContentView
之外创建
MyViewModel()
并将其插入,比如说,
AppDelegate
,随便什么。事实上,没有人说ContentView只创建一次,所以一旦重新创建(在您的案例中是“带到前台”),您就有了新的
MyViewModel
。我刚刚就如何在ScenedLegate上设置它进行了一些讨论,但这似乎是答案@asperi能否请您添加一个答案(或编辑此答案),以给予您应得的荣誉?