Swiftui 如何获取UIRepresentable的协调器类中的值?

Swiftui 如何获取UIRepresentable的协调器类中的值?,swiftui,Swiftui,我正在使用来显示高程,当我点击图表时,我会得到该点的索引,我想使用该索引在其上方的地图上放置一个标记。即位置[索引]。坐标 我有以下代码,我正在尝试将索引值传递给我的mapView,它也使用UIRepresentable显示地图,但我很难弄清楚如何连接到发布服务器 如何将Coordinator类中发布的@Published连接到MapKitView,以便将索引视为Int import SwiftUI import CoreLocation import Charts struct Elevat

我正在使用来显示高程,当我点击图表时,我会得到该点的索引,我想使用该索引在其上方的地图上放置一个标记。即位置[索引]。坐标

我有以下代码,我正在尝试将索引值传递给我的mapView,它也使用UIRepresentable显示地图,但我很难弄清楚如何连接到发布服务器

如何将Coordinator类中发布的@Published连接到MapKitView,以便将索引视为Int

import SwiftUI
import CoreLocation
import Charts

struct ElevationGraphView: UIViewRepresentable  {
    typealias UIViewType = LineChartView
    

    var locations: [CLLocation]?
    let formatter = DateFormatter()
    
    class Coordinator: NSObject, ChartViewDelegate,  ObservableObject {
        
        @Published var index: Int = 0
        
        var parent: ElevationGraphView
        init(_ parent: ElevationGraphView) {
            self.parent = parent
        }
        
        func chartValueSelected(_ uiView: ChartViewBase, entry: ChartDataEntry, highlight: Highlight) {
            
            if let dataSet = uiView.data?.dataSets[highlight.dataSetIndex] {
                let value = dataSet.entryIndex(entry: entry)
                print("Index: \(value)")
                
                // How to get value?
            }
        }
    }
    
    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }


如我所见,最简单的方法是使用外部可观察性(以避免将所有这些东西紧密结合在一起)

这是一种可能的方法(因此两个视图都不了解对方)

您不需要让内部协调器可见(这是毫无意义的)

类协调器:NSObject、ChartViewDelegate{ //…其他代码 func chartValueSelected(uiView:ChartViewBase,条目:ChartDataEntry,高亮显示:高亮显示){ 如果let dataSet=uiView.data?.dataSets[高亮显示.dataSetIndex]{ 让值=dataSet.entryIndex(条目:条目) 打印(“索引:\(值)”) ChartBridge.shared.selectedIndex=值//
struct RaceDetailView: View {
   var body: some View {
        VStack {
            MapKitView(locations: raceDetails.locations, markers: raceDetails.pins, region: raceDetails.region)
            ElevationGraphView(locations: raceDetails.locations)
struct MapKitView: UIViewRepresentable {
    
    let locations: [CLLocation]?
    let markers: [Pin]?
    let region: MKCoordinateRegion?

     ...

    let racePointMarker = RaceMarker(coordinate: locations[index].coordinate, title: "", tint: Color.black)
        mapView.addAnnotation(racePointMarker)
 
class ChartBridge: ObservableObject {
    let shared = ChartBridge()
    @Published var selectedIndex: Int = 0
}
class Coordinator: NSObject, ChartViewDelegate {
    
    // ... other code
    
    func chartValueSelected(_ uiView: ChartViewBase, entry: ChartDataEntry, highlight: Highlight) {
        
        if let dataSet = uiView.data?.dataSets[highlight.dataSetIndex] {
            let value = dataSet.entryIndex(entry: entry)
            print("Index: \(value)")
            
            ChartBridge.shared.selectedIndex = value       // << here set !!
        }
    }
}
struct MapKitView: UIViewRepresentable {
    @ObservedObject var chart = ChartBridge.shared

    // ... other code

    let racePointMarker = RaceMarker(coordinate: 
        locations[chart.selectedIndex].coordinate,    // << here consume !!
        title: "", tint: Color.black)
        mapView.addAnnotation(racePointMarker)