Я программирую приложение для часов на основе некоторых функций моего 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 в представления? Где моя ошибка? Кто-нибудь может, пожалуйста, направить меня правильный способ сделать это? Спасибо.