尝试打开Apple地图以获取方向时,出现错误“无法将'NSKVONotifying'MKPointAnnotation'类型的值转换为'MKMapItem'”。我是新手,我一直在拼凑代码,试图让它工作。
struct Location {
let agencyId: String
let agencyEventId: String
let agencyEventSubTypeCode: String
let latitude: Double
let longitude: Double
let agencyEventTypeCode: String
}
func multiPoint() {
for receivedEvent in receivedEventsList {
mapEventLatitude = receivedEvent.latitude!
mapEventLongitude = receivedEvent.longitude!
latDouble = ("\(mapEventLatitude))" as NSString).doubleValue
longDouble = ("\(mapEventLongitude))" as NSString).doubleValue
multiMapAgencyEventSubTypeCode = receivedEvent.agencyEventSubtypeCode!
multiMapAgencyId = receivedEvent.agencyId!
multiMapAgencyEventId = receivedEvent.agencyEventId!
multiMapAgencyEventTypeCode = receivedEvent.agencyEventTypeCode!
let locations = [
Location(agencyId: multiMapAgencyId, agencyEventId: multiMapAgencyEventId, agencyEventSubTypeCode: multiMapAgencyEventSubTypeCode, latitude: latDouble, longitude: longDouble, agencyEventTypeCode: multiMapAgencyEventTypeCode)
]
for location in locations {
let annotation = MKPointAnnotation()
annotation.coordinate = CLLocationCoordinate2D(latitude: location.latitude, longitude: location.longitude)
annotation.title = location.agencyId
annotation.subtitle = multiMapAgencyEventSubTypeCode
multiEventMap?.addAnnotation(annotation)
eventTypeNumber = ("\(multiMapAgencyEventTypeCode))" as NSString).intValue
}
}
}
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
let reuseIdentifier = "annotationView"
let view = MKMarkerAnnotationView(annotation: annotation, reuseIdentifier: reuseIdentifier)
view.markerTintColor = UIColor.blue
view.glyphText = "x"
view.displayPriority = .required
view.clusteringIdentifier = nil
view.canShowCallout = true
view.rightCalloutAccessoryView = UIButton(type: .detailDisclosure)
return view
}
func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) {
let location = view.annotation as! MKMapItem
let launchOptions = [MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving]
location.openInMaps(launchOptions: launchOptions)
}
最佳答案
当您将注释添加到地图时,您将它们添加为MKPointAnnotation
,因此转换到MKMapItem
将明显失败。
我建议不要创建MKPointAnnotation
,而是创建一个MKPlacemark
或创建自己的MKPlacemark
子类,其中包括您感兴趣的其他属性。那么你的calloutAccessoryControlTapped
可以
将view.annotation
转换为placemark类型;
使用该placemark创建MKMapItem
,然后mapItem.openInMaps(launchOptions:)