Попытка назначить @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. Это только доступное свойство.

Другие вопросы по тегам