我在尝试打开苹果地图以获取路线时收到错误"无法将'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
投射到您的地标类型; - 使用该地标创建一个
MKMapItem
;然后 -
mapItem.openInMaps(launchOptions:)