通过Segue从已点击的mapView MKA注释中传递数据

时间:2019-01-21 17:06:00

标签: swift swift3 segue mkannotation mkannotationview

我试图通过使用calloutAccessoryControlTapped控件点击MkAnnotation标注创建的序列传递数据。我想转到EventViewController并制作一个屏幕,其中包含有关所选MkAnnotation的更多信息。

我尝试了许多不同的方法,包括创建自定义类并尝试发送它。 segue正确发生,但没有数据传递到我的第二个UIViewController(eventViewController)。

我假设每次都做错了事,但是由于将数据分配给变量的原因也是调试的触发,因此很难调试代码。

即我假设根本没有分配数据,但“ selectedAnnotation”变量已正确传递,但显然很难分辨。

    override func prepare(for segue: UIStoryboardSegue, sender: (Any)?) {
        if segue.identifier == "goToEventScreen" {
            selectedAnnotation = mapView.selectedAnnotations.lastObject as? MKAnnotation
            let destinationVC = segue.destination as! EventViewController
            destinationVC.points = selectedAnnotation
        }
    }
}
'''
extension ViewController: MKMapViewDelegate {
    func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView,
                 calloutAccessoryControlTapped control: UIControl){
        performSegue(withIdentifier: "goToEventScreen", sender: self)
    }
}

谢谢。

1 个答案:

答案 0 :(得分:0)

您需要将委托方法中的annotationView设置为performSegue方法的发送者。

extension ViewController: MKMapViewDelegate {
    func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) {
        performSegue(withIdentifier: "goToEventScreen", sender: view)
    }
}

然后准备segue方法:

override func prepare(for segue: UIStoryboardSegue, sender: (Any)?) {
    if segue.identifier == "goToEventScreen" {
        if let annotationView = sender as? MKAnnotationView {
            selectedAnnotation = annotationView.annotation
            let destinationVC = segue.destination as! EventViewController
            destinationVC.points = selectedAnnotation
        }
    }
}

您要做的是从选定的批注视图中获取批注,并将其分配给destinationVC的点。