Координаты LocationManager недоступны в приложении App для часов - PullRequest
1 голос
/ 09 февраля 2020

Я программирую приложение для часов на основе некоторых функций моего iPhone приложения. На телефоне все работает как положено, но в приложении для часов я получаю данные о местоположении слишком поздно. Однако я не могу понять, как правильно это сделать.

Мой работающий ContentView выглядит следующим образом:

struct ContentView: View {

    @ObservedObject var locationManager = LocationManager()
    @ObservedObject var sunTimeData: SunTimeData

     var body: some View {
        VStack {
            OverView().environmentObject(sunTimeData)
        }.onAppear {
            self.setLocation()
         }
    }

    private func setLocation() {
        sunTimeData.latitude = locationManager.location?.latitude ?? 0
        sunTimeData.longitude = locationManager.location?.longitude ?? 0

        LocationManager.retreiveCityName(latitude: sunTimeData.latitude, longitude: sunTimeData.longitude) { (city) in
            self.sunTimeData.cityName = city ?? "Not found"
        }

    }

}

Это работает нормально и передает мои данные о местоположении в объект среды, в котором я могу использовать его в нескольких представлениях.

Приложение Watch структурировано одинаково, однако оно не получает информацию о местоположении и просто передает 0. Если я вызываю locationManager INSIDE представление (внутри a Text (), например, это будет работать, но, поскольку я использую это во многих разных местах, я бы предпочел передать его в свой объект среды и go оттуда.

Я попытался добавить переменные выше тела, но они также все еще 0 во время вызова. Кажется, locationManager начинает обновляться сразу после рендеринга представления.

    var latitude: Double  {
        return locationManager.location?.latitude ?? 0
    }

    var longitude: Double {
        return locationManager.location?.longitude ?? 0
    }

Я использую HostingController.swift для навигации по страницам (пролистывание между представлениями), а на второй странице указаны правильные данные о местоположении. .

class HostingController: WKHostingController<AnyView> {
    override var body: AnyView {
        return AnyView(TestView().environmentObject(SunTimeData()))
    }
}

class NewHostingController: WKHostingController<AnyView> {
    override var body: AnyView {
        return AnyView(ListView().environmentObject(SunTimeData()))
    }
}

Возможно, мне тоже нужно передать locationManager в представления? Где моя ошибка? Кто-нибудь может, пожалуйста, направить меня правильный способ сделать это? Спасибо.

...