swift annotations mapkit mklocalsearch

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.