mapView calloutAccessoryControlTapped,怎么知道是谁发起的?

Posted

技术标签:

【中文标题】mapView calloutAccessoryControlTapped,怎么知道是谁发起的?【英文标题】:mapView calloutAccessoryControlTapped, how to know who launched it? 【发布时间】:2016-02-08 22:53:57 【问题描述】:

我正在处理一个带有地图的项目,其中一些注释的视图具有详细信息按钮。

这些注释是在 for 循环中创建的,我在其中获取 JSON 格式的数据,并为每个元素创建一个注释。 然而,Annotations(或 AnnotationViews)和这些元素之间没有直接的关联。

...
anView?.rightCalloutAccessoryView = UIButton(type: .DetailDisclosure)
...

func mapView(mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) 
        self.performSegueWithIdentifier("openInfo", sender: control)
    

我理解这个按钮调用mapView函数调用calloutAccessoryControlTapped,并通过AnnotationView。

问题是,即使我知道调用 segue 的 AnnotationView,我也不知道 this 响应了谁。 有什么方法可以在 AnnotationView 中保存一些信息?我的意思是,这样 AnnotationView 的每个实例都有一个可以与我收到的数据相关的 ID?

还有什么想法吗?

谢谢

【问题讨论】:

【参考方案1】:

您可以从以下位置访问选定的注释:

let selectedAnnotation = view.annotation as! CustomAnnotation // See structure below.

如果您有要访问的数据源,建议为您的MKAnnotations 创建一个自定义对象,其中包含对您的数据源的一些引用,例如标识符。然后设置:

selectedId = selectedAnnotation.id
performSegueWithIdentifier("openInfo", sender: control)

并在您的prepareForSegue 中将selectedId 传递给接收视图控制器。

编辑:您的注释类可能如下所示:

class CustomAnnotation: NSObject, MKAnnotation 
    var title: String?
    var coordinate: CLLocationCoordinate2D
    var subtitle: String?

    var id: Int

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

        self.id = id
    

【讨论】:

以上是关于mapView calloutAccessoryControlTapped,怎么知道是谁发起的?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用包含 MapView 的包装 TabHost,该 MapView 在其下方显示 AdMob 视图?

MapView 的 onDestroy() 导致 UninitializedPropertyAccessException

在加载 ViewController 之前加载 MapView

MapView 的 UIImageView 子视图

iPhone:mapView.showUserLocation。 VS locationUpdate 函数

安卓; MapView,如何设置默认位置?