Swift: indicaciones para la anotación seleccionada desde la ubicación actual en Maps
annotations mapkit (1)
Para el primer problema:
Un botón de llamada debe establecerse explícitamente en el método de delegado viewForAnnotation
(los pines rojos predeterminados no tienen uno). Aquí hay un ejemplo simple de una posible implementación:
func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! {
if annotation is MKUserLocation {
return nil
}
let reuseId = "pin"
var pinView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId) as? MKPinAnnotationView
if pinView == nil {
pinView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
pinView!.canShowCallout = true
pinView!.pinColor = .Purple
//next line sets a button for the right side of the callout...
pinView!.rightCalloutAccessoryView = UIButton.buttonWithType(.DetailDisclosure) as! UIButton
}
else {
pinView!.annotation = annotation
}
return pinView
}
Para el segundo problema:
En primer lugar, en calloutAccessoryControlTapped
, se puede acceder directamente a la anotación mediante view.annotation
por lo que no es necesario usar la matriz view.annotation
selectedAnnotations
.
A continuación, openMapsWithItems
espera una matriz de objetos MKMapItem
, pero en la matriz que está pasando ( [selectedLoc, currentLoc]
), selectedLoc
no es un MKMapItem
; es simplemente un objeto que implementa MKAnnotation
.
Ejecutar este código dará como resultado un bloqueo con este error:
- [MKPointAnnotation dictionaryRepresentation]: selector no reconocido enviado a la instancia
cuando la aplicación Maps intenta usar selectedLoc
como si fuera un MKMapItem
.
En su lugar, debe crear un MKMapItem
partir de la anotación selectedLoc
. Esto se puede hacer creando primero una MKPlacemark
partir de la anotación usando MKPlacemark(coordinate:addressDictionary:)
y luego creando un MKMapItem
partir de la marca de posición usando MKMapItem(placemark:)
.
Ejemplo:
func mapView(mapView: MKMapView!, annotationView view: MKAnnotationView!,
calloutAccessoryControlTapped control: UIControl!) {
let selectedLoc = view.annotation
println("Annotation ''/(selectedLoc.title!)'' has been selected")
let currentLocMapItem = MKMapItem.mapItemForCurrentLocation()
let selectedPlacemark = MKPlacemark(coordinate: selectedLoc.coordinate, addressDictionary: nil)
let selectedMapItem = MKMapItem(placemark: selectedPlacemark)
let mapItems = [selectedMapItem, currentLocMapItem]
let launchOptions = [MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving]
MKMapItem.openMapsWithItems(mapItems, launchOptions:launchOptions)
}
Mi aplicación actualmente tiene una búsqueda local que agrega anotaciones para los resultados de búsqueda. Quiero configurarlo donde, cuando seleccione la anotación y haga clic en el botón de llamada, se abrirá en la aplicación Mapas con las instrucciones para llegar a la anotación desde la ubicación actual del dispositivo. Estoy teniendo algunos problemas con esto.
En primer lugar, mi botón de llamada en la anotación no aparece. En segundo lugar, no creo que esté detectando la anotación seleccionada correctamente.
Aquí está mi código para la búsqueda y la anotación seleccionada:
func performSearch() {
matchingItems.removeAll()
let request = MKLocalSearchRequest()
request.naturalLanguageQuery = searchText.text
request.region = mapView.region
let search = MKLocalSearch(request: request)
search.startWithCompletionHandler({(response:
MKLocalSearchResponse!,
error: NSError!) in
if error != nil {
println("Error occured in search: /(error.localizedDescription)")
} else if response.mapItems.count == 0 {
println("No matches found")
} else {
println("Matches found")
for item in response.mapItems as! [MKMapItem] {
println("Name = /(item.name)")
println("Phone = /(item.phoneNumber)")
self.matchingItems.append(item as MKMapItem)
println("Matching items = /(self.matchingItems.count)")
var annotation = MKPointAnnotation()
var coordinates = annotation.coordinate
annotation.coordinate = item.placemark.coordinate
annotation.title = item.name
self.mapView.addAnnotation(annotation)
}
}
})
}
func mapView(mapView: MKMapView!, annotationView view: MKAnnotationView!,
calloutAccessoryControlTapped control: UIControl!) {
if self.mapView.selectedAnnotations?.count > 0 {
if let selectedLoc = self.mapView.selectedAnnotations[0] as? MKAnnotation {
println("Annotation has been selected")
let currentLoc = MKMapItem.mapItemForCurrentLocation()
let mapItems = NSArray(objects: selectedLoc, currentLoc)
let launchOptions = [MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving]
MKMapItem.openMapsWithItems([selectedLoc, currentLoc], launchOptions: launchOptions)
}
}
}
Cualquier ayuda será apreciada, gracias de antemano.