【发布时间】:2021-04-26 14:38:29
【问题描述】:
我有这个应用程序,它使用 ObservedObject 在各种视图之间共享数据。
定义视图模型
class MyViewModel: ObservableObject {
@Published var language: String?
}
现在是内容视图
struct ContentView: View {
@ObservedObject private var myViewModel = MyViewModel()
var body: some View {
Home()
.environmentObject(self.myViewModel)
}
}
这里是 Home()
struct Home: View {
@EnvironmentObject var myViewModel: MyViewModel
var body: some View {
VStack {
Text(self.myViewModel.language ?? "")
.onReceive(self.myViewModel.$language, perform: { language in
print(language)
})
Button(action: {
self.myViewModel.language = "American English"
}, label: {
Text("Set the language")
})
}
}
}
onReceive 这里用于调试目的
点击按钮会将语言设置为“美式英语”,Text() 将显示更新后的字符串。
现在将应用置于后台,然后单击图标将其调回前台:尽管 UI 上没有任何更改,但 myviewmodel 为 NIL。
为了“恢复”状态,我修改了 ContentView 以接收“前台通知”,如此处所建议的 https://www.hackingwithswift.com/books/ios-swiftui/how-to-be-notified-when-your-swiftui-app-moves-to-the-background
struct ContentView: View {
@ObservedObject private var myViewModel = MyViewModel()
var body: some View {
Home()
.environmentObject(self.myViewModel)
.onReceive(NotificationCenter.default.publisher(for: UIApplication.willEnterForegroundNotification)) { _ in
self.myViewModel.language = "American English"
}
}
}
Home() 的 onReceive 中的调试打印工作并显示正确的字符串,但 Text() 中的那个消失了,好像它收到了 nil 值并且没有后续刷新。
有什么想法吗?
编辑 必须保持 IOS 13 兼容性
【问题讨论】: