首页 > 解决方案 > 我可以在 Coordinator 中使用 ObservedObject 吗?

问题描述

我有一个使用 MKMapView 的 MapView,我有一个显示 MapView 和 ResultsCarouselView 的 HomeView(为了方便起见,现在只是用 Circle 替换它)。

如果我有一个可观察的对象来管理这个 HomeView 的状态,是否可以从协调器中使用它?例如,我在协调器中从 HomeState 调用的任何内容都不会更新 HomeView:

地图协调员

final class MapCoordinator: NSObject, MKMapViewDelegate {
  @ObservedObject var homeState = HomeState()

  // other code, init, etc.

  func mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation) {
    self.homeState.setUserLocated(true)
  }
}

老家:

class HomeState: NSObject, ObservableObject {
  @Published var userLocated = false

  func setUserLocated(_ value: Bool) {
    self.userLocated = value // debugger comes here, but is this another instance or something?
  }
}

主页视图:

struct HomeView: View {
  @ObservedObject var homeState = HomeState()
  
  var body: some View {
    ZStack(alignment: .bottom) {
      MapView()

      if (homeState.userLocated) {
         Circle()   // this doesn't show up
      }
    }
  }
}

标签: swiftswiftui

解决方案


struct MapView: UIViewRepresentable {
@StateObject var homeState = HomeState()

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

func updateUIView(_ view: MKMapView, context: Context) {

}

func makeCoordinator() -> Coordinator {
    Coordinator(self)
}

class Coordinator: NSObject, MKMapViewDelegate {
    var parent: MapView

    init(_ parent: MapView) {
        self.parent = parent
    }

    func mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation) {
        self.parent.homeState.setUserLocated(true)
    }
}
}

您使用中的parent变量Coordinator来修改任何@State@ObservableObject您的HomeState @ObservedObject


推荐阅读