Как установить значение для EnvironmentObject из класса? - PullRequest
1 голос
/ 19 марта 2020

Я хочу установить значение EnvironmentObject из класса Delegate.

struct AppleMapView: UIViewRepresentable {
  @EnvironmentObject var mapViewViewModel: MapViewViewModel
  let mapViewDelegate = MapViewDelegate()
  class MapViewDelegate: NSObject, MKMapViewDelegate {
    func mapView(_ mapView: MKMapView, didChange mode: MKUserTrackingMode, animated: Bool) {
     // This is where I want to set value to EnvObj
     **mapViewViewModel.mode = mode**
    }
  }
}

Это то, что я хочу сделать.

Мой код выдает ошибку

Instance member 'mapViewViewModel' of type 'AppleMapView' cannot be used on instance of nested type 'AppleMapView.MapViewDelegate'

Итак, я попытался дать ссылку на класс делегата:

MapViewDelegate(vm: mapViewViewModel) Это не имеет ошибки компиляции, но когда я запускаю код, который он сделал ошибки

A View.environmentObject(_:) for MapViewViewModel may be missing as an ancestor of this view.: file /BuildRoot/Library/Caches/com.apple.xbs/Sources/Monoceros_Sim/Monoceros-39.4.3/Core/EnvironmentObject.swift, line 55 ```

Ни один не работает. Как я могу исправить свой код?

1 Ответ

1 голос
/ 19 марта 2020

Работает по-другому, нужно, чтобы ваш MapViewDelegate был координатором для AppleMapView, как показано ниже

struct AppleMapView: UIViewRepresentable {
  @EnvironmentObject var mapViewViewModel: MapViewViewModel

    func makeUIView(context: Context) -> MKMapView {
        let mapView = MKMapView()
        mapView.delegate = context.coordinator // << your delegate
        return mapView
    }

    func makeCoordinator() -> MapViewDelegate {
        MapViewDelegate(self)   // << will be created for you
    }

  class MapViewDelegate: NSObject, MKMapViewDelegate {
    var owner: AppleMapView
    init(_ owner: AppleMapView) {
      self.owner = owner
    }
    func mapView(_ mapView: MKMapView, didChange mode: MKUserTrackingMode, animated: Bool) {
       owner.mapViewViewModel.mode = mode // << now you have access to owner props
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...