Попытка назначить @EnvironmentObject из дочернего представления родительскому не удается, поскольку EnvironmentObject доступен только для чтения
У меня есть приложение на основе карты, поэтому я хочу иметь свойство для всего приложения для текущего положения карты.
Я инициализирую его в SceneDelegate
let currentPosition = CurrentPosition()
let mainView = MainView(appState: AppState(), selectedWeatherStation: nil).environmentObject(currentPosition)
Я заявил об этом в MainView
как @EnvironmentObject
struct MainView: View {
@State var appState: AppState
@State var selectedWeatherStation: WeatherStation? = nil
@EnvironmentObject var currentPosition: CurrentPosition
и я ввожу его в свой UIViewRepresentable
ребенок
MapView(weatherStations: $appState.appData.weatherStations,
selectedWeatherStation: $selectedWeatherStation).environmentObject(currentPosition)
.edgesIgnoringSafeArea(.vertical)
в MapView
struct MapView: UIViewRepresentable {
@Binding var weatherStations: [WeatherStation]
@Binding var selectedWeatherStation: WeatherStation?
@EnvironmentObject var currentPosition: CurrentPosition
у меня есть последний подкласс
final class Coordinator: NSObject, MKMapViewDelegate {
@EnvironmentObject var currentPosition: CurrentPosition
который действует как мой делегат mapview, где я хочу обновить currentPosition
func mapViewDidChangeVisibleRegion(_ mapView: MKMapView) {
currentPosition = CurrentPosition(northEast: mapView.northEastCoordinate, southWest: mapView.southWestCoordinate)
}
Но это заданиеcurrentPosition = CurrentPosition(northEast: mapView.northEastCoordinate, southWest: mapView.southWestCoordinate)
выдаст ошибкуCannot assign to property: 'currentPosition' is a get-only property
и я действительно понятия не имею, что я делаю неправильно.
Цель состоит в том, чтобы обновлять позицию каждый раз, когда пользователь перемещает карту, чтобы я мог выполнить запрос к моему API с текущими координатами.
CurrentPosition объявляется следующим образом
class CurrentPosition: ObservableObject {
@Published var northEast = CLLocationCoordinate2D()
@Published var southWest = CLLocationCoordinate2D()
init(northEast: CLLocationCoordinate2D = CLLocationCoordinate2D(), southWest: CLLocationCoordinate2D = CLLocationCoordinate2D()) {
self.northEast = northEast
self.southWest = southWest
}
}
1 ответ
Полный ответ (расширен из комментария)
Вы просто меняете свойства класса, а не пытаетесь создать другой класс. Вот так:
func mapViewDidChangeVisibleRegion(_ mapView: MKMapView) {
currentPosition.northEast = mapView.northEastCoordinate
currentPosition.southWest = mapView.southWestCoordinate
}
Ошибка:
Невозможно присвоить свойству: currentPosition- свойство только для получения
говорит, что вы не можете присвоить значение непосредственно вcurrentPosition
, потому что это @ObservedObject
/@EnvironmentObject
. Это только доступное свойство.