我尝试使用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
答案 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
}
}