Вы сказали:
Контейнер и карта отображаются одновременно.
Если они оба созданы одновременно, то 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
}
}