Свифт, как мне сделать выноску аннотации пин-кода? (полные шаги, пожалуйста)
Я пытался заставить сноску работать, но этого не произошло, так как я сделал что-то не так в своей подготовке к переходу. Я хочу знать, как сделать выноску аннотации булавки для другого представления?
1 ответ
Процесс перехода к другой сцене при нажатии кнопки в выноске выглядит так:
Установить
delegate
вида карты, чтобы быть контроллером представления. Это можно сделать либо в "Инспекторе соединений", либо программно. Вы хотите указать, что контроллер представления соответствуетMKMapViewDelegate
, тоже.Когда вы создаете аннотацию, обязательно установите заголовок:
let annotation = MKPointAnnotation() annotation.coordinate = coordinate annotation.title = ... self.mapView.addAnnotation(annotation)
Определите представление аннотации для включения выноски с помощью кнопки:
func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? { if annotation is MKUserLocation { return nil } var annotationView = mapView.dequeueReusableAnnotationViewWithIdentifier(identifier) as? MKPinAnnotationView if annotationView == nil { annotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: identifier) annotationView?.canShowCallout = true annotationView?.rightCalloutAccessoryView = UIButton(type: .InfoLight) } else { annotationView?.annotation = annotation } return annotationView }
Например, это дает сноску что-то похожее на следующее, с
.InfoLight
Кнопка справа:Воплощать в жизнь
calloutAccessoryControlTapped
который программно выполняет переход:func mapView(mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) { performSegueWithIdentifier("SegueToSecondViewController", sender: view) }
Очевидно, это предполагает, что вы определили переход между двумя контроллерами представления и дали ему тот же идентификатор раскадровки, на который вы ссылаетесь в приведенном выше коде:
Когда вы переходите, передайте необходимую информацию в место назначения. Например, вы можете передать ссылку на аннотацию:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if let destination = segue.destinationViewController as? SecondViewController, let annotationView = sender as? MKPinAnnotationView { destination.annotation = annotationView.annotation as? MKPointAnnotation } }
Для получения дополнительной информации см. Создание выносок в Руководстве по программированию местоположения и карт.