ObservableObject在我的课程中具有不同的实例化

时间:2020-04-16 01:58:12

标签: swift swiftui

我有一个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'

1 个答案:

答案 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
    }
        ...
}