我正在开发一个新的 SwiftUI 应用程序,我正在尝试弄清楚如何使这个 Swift 项目与 SwiftUI 兼容。在此示例中,我正在开发带有方向的地图。
问题是我无法使 UIViewRepresentable 工作。我收到错误:
类型“DirectionsMap”不符合协议“UIViewRepresentable”
这是我的代码:
import SwiftUI
import MapKit
struct DirectionsMap: UIViewRepresentable {
@EnvironmentObject var model: ViewModel
var business: Businesses
// Start Coordinates for Directions
var start: CLLocationCoordinate2D {
return model.locationManager.location?.coordinate ?? CLLocationCoordinate2D()
}
// End Coordinates for Directions
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 {
// Create Map
let map = MKMapView()
map.delegate = context.coordinator
map.showsUserLocation = true
map.userTrackingMode = .followWithHeading
// Create Directions request
var request = MKDirections.Request()
request.source = MKMapItem(placemark: MKPlacemark(coordinate: start))
request.destination = MKMapItem(placemark: MKPlacemark(coordinate: end))
// Create Directions Object
let directions = MKDirections(request: request)
directions.calculate { response, error in
if error == nil && response != nil {
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) {
}
static func dismantleUIView(_ uiView: MKMapView, coordinator: ()) {
uiView.removeAnnotations(uiView.annotations)
uiView.removeOverlays(uiView.overlays)
}
//MARK: - Coordinator
func makeCoordinator() -> Coordinator {
return Coordinator()
}
}
class Coordinator: NSObject, MKMapViewDelegate {
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
let renderer = MKPolylineRenderer(polyline: overlay as! MKPolyline)
renderer.strokeColor = .blue
renderer.lineWidth = 5
return renderer
}
}
尝试添加
struct DirectionsMap: UIViewRepresentable {
typealias UIViewType = MKMapView // <-- This
我注意到,当更改 make 和 update 函数的类型时,协议需要显式类型别名。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)