如何检测在 MapView 中选择了哪个注释

Posted

技术标签:

【中文标题】如何检测在 MapView 中选择了哪个注释【英文标题】:How can I detect which annotation was selected in MapView 【发布时间】:2016-08-29 12:31:17 【问题描述】:

我在地图中做了一些注释,当我点击它们时,我会看到一些信息,并且我有一个打开地图的按钮,并且我无法使用正确的信息来绘制我的路线。

这是我的代码:

我的 lat & lon 有 2 个 double 数组,我从查询中填充它们。

 var lat = [Double]()
 var lon = [Double]()

这些行用于填充注释

self.annot = Islands(title: object["name"] as! String, subtitle: object["address"] as! String,  coordinate: CLLocationCoordinate2D(latitude: (position?.latitude)!, longitude: (position?.longitude)!), info: object["address"] as! String)

self.map.addAnnotations([self.annot])

这是创建注释的地方:

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

    let identifier = "pin"

    if annotation.isKindOfClass(MKUserLocation) 
        return nil
    

    let image = UIImage(named: "car")
    let button = UIButton(type: .Custom)
    button.frame = CGRectMake(0, 0, 30, 30)
    button.setImage(image, forState: .Normal)
    button.addTarget(self, action: #selector(Map.info(_:)), forControlEvents:UIControlEvents.TouchUpInside)

    var annotationView = mapView.dequeueReusableAnnotationViewWithIdentifier(identifier)
    if  annotationView == nil 
        annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: "pin")
        annotationView!.canShowCallout = true
        annotationView!.image = UIImage(named: "annotation")
        annotationView!.rightCalloutAccessoryView = button

    
    else 
        annotationView!.annotation = annotation
    

    return annotationView


最后这是按钮的功能,我应该传递正确的信息(以及问题所在)

   func info(sender: UIButton)
    

        let latitute:CLLocationDegrees  =  lat[sender.tag]
        let longitute:CLLocationDegrees =  lon[sender.tag]

        let regionDistance:CLLocationDistance = 10000
        let coordinates = CLLocationCoordinate2DMake(latitute, longitute)
        let regionSpan = MKCoordinateRegionMakeWithDistance(coordinates, regionDistance, regionDistance)
        let options = [
            MKLaunchOptionsMapCenterKey: NSValue(MKCoordinate: regionSpan.center),
            MKLaunchOptionsMapSpanKey: NSValue(MKCoordinateSpan: regionSpan.span)
        ]
        let placemark = MKPlacemark(coordinate: coordinates, addressDictionary: nil)
        let mapItem = MKMapItem(placemark: placemark)
        mapItem.name = name[sender.tag]
        print(sender.tag)
        mapItem.openInMapsWithLaunchOptions(options)
    

如您所见,我尝试使用发件人标签,但没有成功。

编辑:我的自定义注释类

class Islands: NSObject, MKAnnotation 

    var title: String?
    var addr: String?
    var coordinate: CLLocationCoordinate2D
    var info: String?
    var subtitle: String?

    init(title: String, subtitle: String, coordinate: CLLocationCoordinate2D, info: String) 
        self.title = title 
        self.coordinate = coordinate
        self.info = info
        self.subtitle = subtitle

    


【问题讨论】:

【参考方案1】:

为此,您可以使用从didSelectAnnotationView 中选择的Annotation,然后将该注释存储到实例变量中,然后在您的Button 操作方法中使用注释。

var selectedAnnotation: MKPointAnnotation?

func mapView(mapView: MKMapView, didSelectAnnotationView view: MKAnnotationView) 
    self.selectedAnnotation = view.annotation as? MKPointAnnotation


func info(sender: UIButton) 
    print(selectedAnnotation?.coordinate)

编辑:您有自定义的MKAnnotation 类,您需要使用它。

var selectedAnnotation: Islands?

func mapView(mapView: MKMapView, didSelectAnnotationView view: MKAnnotationView) 
    self.selectedAnnotation = view.annotation as? Islands
    

【讨论】:

当我点击按钮时 好的,现在我没有得到 nil,但我得到了这个:可选()我更新了我的答案,所以你可以知道群岛是什么 我认为你有自定义注释类,对吧?这就是MKPointAnnotation 不起作用的原因。【参考方案2】:

对于 Swift 4

func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) 
    var selectedAnnotation = view.annotation

【讨论】:

以上是关于如何检测在 MapView 中选择了哪个注释的主要内容,如果未能解决你的问题,请参考以下文章

显示选定半径的 MapView 注释

MapView 注释:查找坐标

如何更改 MapView 注释中的标注气泡颜色?

从 MapView 中删除多个注释

SwiftUI Map 混合注释

如何让程序知道选择了哪个注释并能够访问它的属性?