Свифт, как мне сделать выноску аннотации пин-кода? (полные шаги, пожалуйста)

Я пытался заставить сноску работать, но этого не произошло, так как я сделал что-то не так в своей подготовке к переходу. Я хочу знать, как сделать выноску аннотации булавки для другого представления?

1 ответ

Решение

Процесс перехода к другой сцене при нажатии кнопки в выноске выглядит так:

  1. Установить delegate вида карты, чтобы быть контроллером представления. Это можно сделать либо в "Инспекторе соединений", либо программно. Вы хотите указать, что контроллер представления соответствует MKMapViewDelegate, тоже.

  2. Когда вы создаете аннотацию, обязательно установите заголовок:

    let annotation = MKPointAnnotation()
    annotation.coordinate = coordinate
    annotation.title = ...
    self.mapView.addAnnotation(annotation)
    
  3. Определите представление аннотации для включения выноски с помощью кнопки:

    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 Кнопка справа:

  4. Воплощать в жизнь calloutAccessoryControlTapped который программно выполняет переход:

    func mapView(mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) {
        performSegueWithIdentifier("SegueToSecondViewController", sender: view)
    }
    

    Очевидно, это предполагает, что вы определили переход между двумя контроллерами представления и дали ему тот же идентификатор раскадровки, на который вы ссылаетесь в приведенном выше коде:

  5. Когда вы переходите, передайте необходимую информацию в место назначения. Например, вы можете передать ссылку на аннотацию:

    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
        }
    }
    

Для получения дополнительной информации см. Создание выносок в Руководстве по программированию местоположения и карт.

Другие вопросы по тегам