获取 MKPointAnnotation 标题

Posted

技术标签:

【中文标题】获取 MKPointAnnotation 标题【英文标题】:Get MKPointAnnotation title 【发布时间】:2014-09-28 17:16:29 【问题描述】:

我创建了一个 MKMapView,其中包含地图上的几个 MKPointAnnotations。当用户单击视图中的 UIButton 时,我想在日志中打印标题。我怎样才能做到这一点?到目前为止,我有这个:

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) 



【问题讨论】:

【参考方案1】:

在自定义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!)")

【讨论】:

以上是关于获取 MKPointAnnotation 标题的主要内容,如果未能解决你的问题,请参考以下文章

MKPointAnnotation 不再在 iOS 11 中显示标题

为啥我的 MKPointAnnotation 不是自定义的?

拖动时更新 MKPointAnnotation 对象

MKPointAnnotation 在标签中显示图像

向 MKPointAnnotation 添加按钮?

自定义 MKPointAnnotation 颜色