将 onClick 事件添加到 MKAnnotation swift

Adding onClick event to MKAnnotation swift

我目前正在使用 alamofire 从网络请求中获取一些位置,将它们存储在我的对象数组中,然后在 MKMapView 上显示它们。

 func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
    guard !(annotation is MKUserLocation) else {
        return nil
    }

    let annotationIdentifier = "AnnotationIdentifier"

    var annotationView: MKAnnotationView?
    if let dequeuedAnnotationView = mapView.dequeueReusableAnnotationView(withIdentifier: annotationIdentifier) {
        annotationView = dequeuedAnnotationView
        annotationView?.annotation = annotation
    }
    else {
        annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: annotationIdentifier)
        annotationView?.rightCalloutAccessoryView = UIButton(type: .detailDisclosure)
    }

    if let annotationView = annotationView {
        annotationView.canShowCallout = true
        annotationView.image = UIImage(named: "atm_map_icon")
    }

    return annotationView
}

这里是我解析 json 的地方,将结果放入一个数组中,循环遍历数组并将标记添加到地图中

for var i in 0..<json.count{
                let name = json[i]["Name"].string
                let address = json[i]["Address"].string
                let lat = json[i]["Lat"].double
                let lon = json[i]["Lon"].double
                let atm = Atm(name: name!,address: address!,lat: lat!,lon: lon!)
                self.atmArrayList.append(atm)



            }
            print(self.atmArrayList.count)
        }
        for atm in self.atmArrayList{
            let atmPin = AtmAnnotation(title: atm.name!, subtitle: atm.address!, atm: atm, coordinate: CLLocationCoordinate2D(latitude: atm.lat!, longitude: atm.lon!))
            self.annotationArray.append(atmPin)
        }

        self.atmMapView.addAnnotations(self.annotationArray)

我想要实现的是,当用户单击 rightCalloutAccessoryView 按钮时,我想将该注释的特定 Atm 对象传递给另一个 ViewController。

我的猜测是给Annotations一个id,然后从那个特定位置的Atm数组中获取Atm??

您需要在 viewController

中实现 MapViewDelegate 的这个方法
func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) {
  let anotherViewController = self.storyboard?.instantiateViewController(withIdentifier: "anotherViewController") as! AnotherViewController
  if let atmPin = view.annotation as? AtmAnnotation
  {
    anotherViewController.currentAtmPin = atmPin
  }
  self.navigationController?.pushViewController(anotherViewController, animated: true)

}

希望对您有所帮助