如何通过Binding和ObservedObject更新UIViewRepresentable地图

我有一个简单的MapView,并且有一个ObservedObject数据源要更新,但是不起作用。

这是内容视图:

struct ContentView: View {
    @ObservedObject var trackingOnmapViewModel = TrackingOnmapViewModel()

    var body: some View {
        ZStack {
            MapView(selectedRegion: $trackingOnmapViewModel.selectedRegion)
                .edgesIgnoringSafeArea(.vertical)
            VStack {
                Spacer()
                Button(action: {
                    self.trackingOnmapViewModel.selectNextRegion()
                }) {
                    Text("Next")
                        .padding()
                }
            }
        }
    }
}

这是一个简单的地图视图:

struct MapView: UIViewRepresentable {
    @Binding var selectedRegion: MKCoordinateRegion

    func makeUIView(context: Context) -> MKMapView {
        print("MapView - makeUIView")
        let map = MKMapView()
        return map
    }

    func updateUIView(_ mapView: MKMapView,context: Context) {
        print("MapView - updateUIView")
        mapView.setRegion(selectedRegion,animated: true)
    }
}

这是数据源:

class TrackingOnmapViewModel: ObservableObject {

    var regions: [MKCoordinateRegion] = [
        MKCoordinateRegion(center: CLLocationCoordinate2D(latitude: 10.0,longitude: 10.0),span: MKCoordinateSpan(latitudeDelta: 2.0,longitudeDelta: 2.0)),MKCoordinateRegion(center: CLLocationCoordinate2D(latitude: 20.0,longitude: 20.0),MKCoordinateRegion(center: CLLocationCoordinate2D(latitude: 30.0,longitude: 30.0),MKCoordinateRegion(center: CLLocationCoordinate2D(latitude: 40.0,longitude: 40.0),longitudeDelta: 2.0))
    ]

    var selectedRegion: MKCoordinateRegion = MKCoordinateRegion(center: CLLocationCoordinate2D(latitude: 0.0,longitude: 0.0),longitudeDelta: 2.0))

    var currentIndex = 0


    func selectNextRegion() {
        print("TrackingOnmapViewModel - selectNextLandmark")
        currentIndex = currentIndex < regions.count-1 ? currentIndex + 1 : 0
        self.selectedRegion = regions[currentIndex]
        print("selectedRegion - \(selectedRegion)")
    }
}

在这种情况下,地图不会更新。

如果我在没有ObservedObject的情况下将逻辑放入ContentView:

struct ContentView: View {
//    @ObservedObject var trackingOnmapViewModel = TrackingOnmapViewModel()

@State var regions: [MKCoordinateRegion] = [
    MKCoordinateRegion(center: CLLocationCoordinate2D(latitude: 10.0,longitudeDelta: 2.0))
]

@State var selectedRegion: MKCoordinateRegion = MKCoordinateRegion(center: CLLocationCoordinate2D(latitude: 0.0,longitudeDelta: 2.0))

@State var currentIndex = 0

var body: some View {
    ZStack {
        MapView(selectedRegion: $selectedRegion)
            .edgesIgnoringSafeArea(.vertical)
        VStack {
            Spacer()
            Button(action: {
                self.selectNextRegion()
            }) {
                Text("Next")
                    .padding()
            }
        }
    }
}

private func selectNextRegion() {
    print("ContentView - selectNextLandmark")
    currentIndex = currentIndex < regions.count-1 ? currentIndex + 1 : 0
    self.selectedRegion = regions[currentIndex]
}

}

然后地图正在更新。

您能帮我吗?

linchao911 回答:如何通过Binding和ObservedObject更新UIViewRepresentable地图

当我发布问题时,我发现了问题。 我忘了在TrackingOnMapViewModel中将selectedRegion变量标记为@Published。

@Published var selectedRegion: MKCoordinateRegion = MKCoordinateRegion
本文链接:https://www.f2er.com/3153826.html

大家都在问