SwiftUI обновляет глобальное состояние с извлеченными данными - PullRequest
0 голосов
/ 13 октября 2019

Я не могу обновить EnvironmentObject данными из сетевого ответа. Исходные данные отображаются правильно. Я хочу, чтобы вызов класса API обновлял глобальное состояние с ответом. Затем я получил сбой

Неустранимая ошибка: Обнаружен ObservableObject типа AppState.

View.environmentObject (_ :) для AppState может отсутствовать как предок этого представления. File /BuildRoot / Library / Caches / com.apple.xbs / Sources / Monoceros_Sim / Monoceros-30.4 / Core / EnvironmentObject.swift, строка 55 #

struct GameView: View {
    var location = LocationService()
    @EnvironmentObject var appState: AppState
    var body: some View {
        VStack{
            Text("countryRegion: \(self.appState.countryRegion)")
            Text("adminDistrict: \(self.appState.adminDistrict)")
        }.onAppear(perform: startMonitoring)
    }

    func startMonitoring() {
        self.appState.isGameActive = true
        self.location.startMonitoringLocation()
    }
}

class LocationService: NSObject, CLLocationManagerDelegate{
    @EnvironmentObject var appState: AppState
...
    func getAddress(longitude: CLLocationDegrees, latitude: CLLocationDegrees) {
        let url = URL(string: "http://dev.virtualearth.net/REST/v1/Locations/\(latitude),\(longitude)?o=json&key=\(self.key)")!

        URLSession.shared.dataTask(with: url) { (data, response, error) in
            guard let data = data else { return }
            let response = try! JSONDecoder().decode(Results.self, from: data)
            DispatchQueue.main.async {
                self.appState.adminDistrict = response.resourceSets[0].resources[0].address.adminDistrict;
                self.appState.countryRegion = response.resourceSets[0].resources[0].address.countryRegion;
            }
        }.resume()
    }

Объявление AppState:

class AppState: ObservableObject {
    @Published var isGameActive = false
    @Published var countryRegion = ""
    @Published var adminDistrict = ""
}

опубликовать структуру, которая присоединяет объект среды AppState к иерархии представления. Я прикрепил AppState в SceneDelegate к ContentView в качестве моего корневого представления (если я правильно понял)

window.rootViewController = UIHostingController(rootView:ContentView().environmentObject(appState))

Должен ли яприкрепить его к каждому представлению, которое изменяет AppState?

...