Глобальная переменная не использует один и тот же экземпляр для всех представлений - PullRequest
0 голосов
/ 15 апреля 2020

Ниже мой класс, который содержит строку, чтобы определить, какая это страна. Я пытаюсь убедиться, что все они имеют одинаковые представления

import Foundation

class GlobalData: ObservableObject {

    @Published var whichCountry: String = "italy"
}

Это мое представление IndepthView, с которого я все начинаю. Я создаю EnvironmentObject для класса globalData. Оттуда я передаю его в другое представление и метод, который использую для обновления информации в IndepthView

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) {
    }
  }
}

. Затем я передаю переменную globalData в другое представление, чтобы обновить строку до «usa». Я также проверяю, чтобы убедиться, что он корректно обновлялся.

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("usa)")
                                .font(.system(size: 25))
                            Divider()
                        }

                    }
            }
        }
    }
}

struct ListOfCountriesView_Previews: PreviewProvider {
    static var previews: some View {
        ListOfCountriesView().environmentObject(GlobalData())
    }
}

Но когда я добираюсь до своего класса getDepthData (), он не показывает измененный текст, а просто отображает "italy", когда это должно быть отображение "США". Я не совсем уверен, как передать переменную 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()
    }
}

1 Ответ

0 голосов
/ 21 апреля 2020

Похоже, у вас есть два экземпляра объекта GlobalData в вашем InDepthView. Как бы вы ни передавали экземпляр EnvironmentObject в представление, вы должны использовать этот же экземпляр для создания переменной «data» в инициализаторе, а не делать это встроенным образом, как здесь:

@EnvironmentObject var globalData: GlobalData
@ObservedObject var data = getDepthData(globalData: GlobalData())

Итак, если вы Находясь в родительском представлении InDepthView, вы можете инициализировать его следующим образом:

struct ParentView: View {
    @EnvironmentObject var globalData: GlobalData

    var body: some View {
       ...
        IntDepthView(data: getDepthData(globalData: self.globalData))
       ...
    }
}

В зависимости от того, как часто это родительское представление перерисовывается, существуют другие способы. В любом случае, мне кажется, что у объекта getDepthData есть собственный экземпляр GlobalData, а не обновленный экземпляр EnvironmentObject.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...