Передача заголовка аннотации для встроенного контейнера при выборе Swift - PullRequest
0 голосов
/ 02 января 2019

Я пытался использовать func mapView (_ mapView: MKMapView, didSelect view: MKAnnotationView), чтобы передать заголовок аннотации во встроенное представление контейнера.Однако, когда я строю и запускаю, это не работает.

Что я делаю неправильно?Это правильный подход?

Я пробовал func mapView (_mapView: MKMapView, didSelect view: 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
    }
}

}

Данныепередается в контейнерный контроллер как «Deafult» вместо значения annotation.title

1 Ответ

0 голосов
/ 02 января 2019

Вы сказали:

Контейнер и карта отображаются одновременно.

Если они оба созданы одновременно, то 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
    }
}
...