SwiftUI开发报错:Type 'DirectionsMap'不遵守UIViewRepresentable协议
解决UIViewRepresentable协议不遵守问题
错误的直接原因是dismantleUIView方法的参数类型不符合协议要求。在UIViewRepresentable协议中,dismantleUIView的coordinator参数必须是你自定义的Coordinator类型,而非空元组()。
修正后的完整代码:
import SwiftUI import MapKit struct DirectionsMap: UIViewRepresentable { @EnvironmentObject var model: ViewModel var business: Businesses // 起点坐标 var start: CLLocationCoordinate2D { return model.locationManager.location?.coordinate ?? CLLocationCoordinate2D() } // 终点坐标 var end: CLLocationCoordinate2D { if let lat = business.coordinates?.latitude, let long = business.coordinates?.longitude { return CLLocationCoordinate2D(latitude: lat, longitude: long) } else { return CLLocationCoordinate2D() } } func makeUIView(context: Context) -> MKMapView { let map = MKMapView() map.delegate = context.coordinator map.showsUserLocation = true map.userTrackingMode = .followWithHeading // 发起路线请求 let request = MKDirections.Request() request.source = MKMapItem(placemark: MKPlacemark(coordinate: start)) request.destination = MKMapItem(placemark: MKPlacemark(coordinate: end)) let directions = MKDirections(request: request) directions.calculate { response, error in guard let response = response, error == nil else { return } for route in response.routes { map.addOverlay(route.polyline) map.setVisibleMapRect(route.polyline.boundingMapRect, edgePadding: UIEdgeInsets(top: 100, left: 100, bottom: 100, right: 100), animated: true) } } // 添加终点标注 let annotation = MKPointAnnotation() annotation.coordinate = end annotation.title = business.name ?? "" map.addAnnotation(annotation) return map } func updateUIView(_ uiView: MKMapView, context: Context) {} // 修正coordinator参数类型为自定义的Coordinator static func dismantleUIView(_ uiView: MKMapView, coordinator: Coordinator) { uiView.removeAnnotations(uiView.annotations) uiView.removeOverlays(uiView.overlays) } func makeCoordinator() -> Coordinator { Coordinator() } } class Coordinator: NSObject, MKMapViewDelegate { func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer { guard let polyline = overlay as? MKPolyline else { return MKOverlayRenderer(overlay: overlay) } let renderer = MKPolylineRenderer(polyline: polyline) renderer.strokeColor = .blue renderer.lineWidth = 5 return renderer } }
额外优化说明:
- 替换了原代码中
response!的强制解包为guard let,避免潜在的运行时崩溃 - 在
rendererFor方法中增加了类型转换的安全判断,提升代码健壮性
内容的提问来源于stack exchange,提问作者Nikita Kolomoec
相关产品推荐
相关产品推荐

