我有一个ObservableObject,它存储了用户想要获得信息的当前国家/地区,并且希望在所有视图和类之间共享它。我在场景委托中正确声明了它,所以没有问题。
import Foundation
class GlobalData: ObservableObject {
@Published var whichCountry: String = "italy"
}
这是我调用环境对象以获取whichCountry的主要视图。当用户单击按钮时,它将打开ListOfCountriesView()并将该EnvironemtnObject传递给它,以更新用户想要的新国家。
import SwiftUI
struct InDepthView: View {
@State var showList = false
@EnvironmentObject var globalData: GlobalData
@ObservedObject var data = getDepthData(globalData: GlobalData())
var body: some View {
VStack(alignment: .leading) {
Button(action: { self.showList.toggle() }) {
VStack(alignment: .leading) {
HStack {
Text("\(self.data.globalDatam.whichCountry.uppercased())")
}
}
}
.sheet(isPresented: $showList) {
ListOfCountriesView().environmentObject(GlobalData())
}
}
}
}
import SwiftUI
struct ListOfCountriesView: View {
@EnvironmentObject var globalData: GlobalData
var body: some View {
ScrollView {
VStack(spacing: 15) {
Text("List of Countries")
.padding(.top, 25)
Button(action: {
self.globalData.whichCountry = "usa"
self.presentationMode.wrappedValue.dismiss()
}) {
VStack {
Text("\(self.globalData.whichCountry)")
.font(.system(size: 25))
Divider()
}
}
}
}
}
}
struct ListOfCountriesView_Previews: PreviewProvider {
static var previews: some View {
ListOfCountriesView().environmentObject(GlobalData())
}
}
当用户更改国家/地区时,我希望使用新字符串更新InDepthView.swift文件中的此类。但是由于某种原因,根据ListOfCountriesView()中发生的情况,当它本应更改为“美国”时,它仍显示“意大利”。因此,我知道GlobalData有两个实例,但是我不确定如何解决此问题。在过去的两天里,我一直在努力解决此问题,对您的任何帮助将不胜感激!
class getDepthData: ObservableObject {
@Published var data : Specific!
@Published var countries : HistoricalSpecific!
var globalDatam: GlobalData
init(globalData: GlobalData) {
globalDatam = globalData
print(globalDatam.whichCountry + " init()")
updateData()
}
func updateData() {
let url = "https://corona.lmao.ninja/v2/countries/" // specific country
let session = URLSession(configuration: .default
session.dataTask(with: URL(string: url+"\(self.globalDatam.whichCountry)")!) { (data, _, err) in
if err != nil {
print((err?.localizedDescription)!)
return
}
let json = try! JSONDecoder().decode(Specific.self, from: data!)
DispatchQueue.main.async {
self.data = json
}
}.resume()
}
}
//////// 我将其添加到您提到的代码中。但收到错误
import SwiftUI
struct InDepthView: View {
@State var showList = false
@State var pickerSelectedItem = 1
@EnvironmentObject var globalData: GlobalData
@ObservedObject var data: getDepthData
init() {
self.data = getDepthData(globalData: self.globalData)
}
ERRROR:在初始化所有存储的属性之前使用self'
答案 0 :(得分:0)
调用
时,您正在创建第二个GlobalData实例。 @ObservedObject var data = getDepthData(globalData: GlobalData())
编辑:删除了将环境对象作为参数传递的示例。那不起作用,它崩溃了。
您将需要进行一些重构,以完全不同地构建应用程序,或者可以删除环境对象,而在第一个视图中初始化GlobalData(),然后将其作为@传递给每个后续视图。 ObservedObject,而不是通过场景委托作为@EnvironmentObject。
以下是伪代码,但我希望澄清一下我的意思:
struct ContentView: View {
@ObservedObject var globalData = GlobalData()
var body: some View {
...
NavigationLink("Linky link", destination: SecondView(globalData: globalData, data: getDepthData(globalData: globalData))
}
}
struct SecondView: View {
@ObservedObject var globalData: GlobalData
@ObservedObject var data: getDepthData
init(globalData: GlobalData, data: getDepthData) {
self.globalData = globalData
self.data = getDepthData
}
...
}