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