选择Swift时将注释标题传递给嵌入式ContainerView

时间:2019-01-02 16:48:18

标签: swift xcode mkannotationview

我尝试使用func mapView(_ mapView:MKMapView,didSelect视图:MKAnnotationView)将注释标题传递给嵌入式容器视图。但是,当我构建并运行时,它不起作用。

我做错了什么?这是正确的方法吗?

我尝试过func mapView(_ mapView:MKMapView,didSelect视图:MKAnnotationView)看代码

var annotationTitle = "Default"



func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView){
    if let annotation = view.annotation {
        annotationTitle = annotation.title!!
    }

}


override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showMapContainer" {
        let destination = segue.destination as! MapDetailContainerViewController
        destination.selectedAnnotation = annotationTitle as String
    }
}

}

数据以“默认”(而不是annotation.title值)的形式被传递给containerviewcontroller

1 个答案:

答案 0 :(得分:0)

您说:

  

同时显示容器和地图。

如果它们是同时创建的,那么prepare(for:sender:)无疑会在didSelect之前被调用。您可以通过一些断点或明智的print语句来确认这一点。

因此,您可以prepare(for:sender:)在某个局部变量中保存对segue.destination as? MapDetailContainerViewController的引用,然后didSelect可以设置selectedAnnotation

var embeddedViewController: MapDetailContainerViewController?

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showMapContainer" {
        embeddedViewController = segue.destination as? MapDetailContainerViewController
    }
}

func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
    if let annotation = view.annotation,
        let title = annotation.title {
            embeddedViewController?.selectedAnnotation = title
    }
}

或者您可以绕过prepare(for:sender)而只使用children(以前称为childViewControllers):

func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView){
    if let embeddedViewController = children.first as? MapDetailContainerViewController,
        let annotation = view.annotation,
        let title = annotation.title {
            embeddedViewController.selectedAnnotation = title
    }
}