2014-09-28 2 views
0

Я создал MKMapView, который содержит несколько MKPointAnnotations на карте. Когда пользователь нажимает на UIButton в представлении, я хотел бы напечатать заголовок в журнале. Как я могу это сделать? До сих пор у меня есть это:Получить MKPointAnnotation название

func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! { 

    if annotation is MKUserLocation { 
     //return nil so map view draws "blue dot" for standard user location 
     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!.animatesDrop = true 
     pinView!.pinColor = .Purple 


     var rightButton: AnyObject! = UIButton.buttonWithType(UIButtonType.DetailDisclosure) 
     //MapPointAnnotation *point = (MapPointAnnotation*)pinView.annotation; 
     //rightButton.venue = point.venue; 
     rightButton.titleForState(UIControlState.Normal) 

     rightButton.addTarget(self, action: "rightButtonTapped:", forControlEvents: UIControlEvents.TouchUpInside) 
     pinView!.rightCalloutAccessoryView = rightButton as UIView 

    } 
    else { 
     pinView!.annotation = annotation 
    } 

    return pinView 
} 



func rightButtonTapped(sender: AnyObject) { 


} 

ответ

0

В методе пользовательского rightButtonTapped, простой и надежный способ, чтобы получить ссылку на аннотацию, которая прослушивается, чтобы использовать selectedAnnotations массив вид карты в:

func rightButtonTapped(sender: AnyObject) { 
    if self.mapView.selectedAnnotations?.count == 0 { 
     //no annotation selected 
     return; 
    } 

    if let ann = self.mapView.selectedAnnotations[0] as? MKAnnotation { 
     println("\(ann.title!)") 
    } 
} 

(Даже если selectedAnnotations массив, вид карты позволяет только один аннотации быть «выбрана» в то время, поэтому выбранные аннотации всегда индекс 0.)


Однако лучшим способом, чем использование настраиваемого метода кнопок, является использование метода делегата calloutAccessoryControlTapped вида карты. Метод делегата передает вам ссылку на аннотацию, которая была прослушена, из которой вы можете легко получить основную аннотацию.

Чтобы использовать метод делегата, удалить в addTarget линии для пользовательского метода:

//Do NOT call addTarget if you want to use the calloutAccessoryControlTapped 
//delegate method instead of a custom button method. 
//rightButton.addTarget(self, action: "rightButtonTapped:", forControlEvents: UIControlEvents.TouchUpInside) 

, а затем реализовать метод делегата вместо пользовательского метода кнопки:

func mapView(mapView: MKMapView!, annotationView view: MKAnnotationView!, calloutAccessoryControlTapped control: UIControl!) { 
    println("\(view.annotation.title!)") 
} 
Смежные вопросы