Представление контроллера подробного просмотра из аннотации карты в swift 3?

#ios #swift #xcode #swift3

#iOS #swift #xcode #swift3

Вопрос:

Я исследовал эту тему почти 3 дня подряд, пытаясь выяснить, как представить мой контроллер детального просмотра, нажав на кнопку info аннотации карты в моем контроллере просмотра карты. В принципе, я могу заставить аннотацию отображаться, но когда я нажимаю на аннотацию, ничего не происходит. Я хотел бы, чтобы он отображал мой контроллер детального просмотра точно так же, как при нажатии на тот же элемент в моем контроллере табличного представления он переходит непосредственно к соответствующему подробному представлению.

Любая помощь была бы очень, очень признательна! Это изображение аннотации карты, которое у меня есть в данный момент

Ниже приведен мой код для моего MapViewController. Я чувствую, что что-то не так или чего-то не хватает в моих функциях prepareForSegue или annotationView.

 extension MapViewController {

  // 1
  @objc(mapView:viewForAnnotation:) func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {

    if let annotation = annotation as? Annotations {

      let reuseID = "pin"

      var view: MKPinAnnotationView
      if let dequeuedView = mapView.dequeueReusableAnnotationView(withIdentifier: reuseID)
            as? MKPinAnnotationView { // 2
          dequeuedView.annotation = annotation
          view = dequeuedView
      } else {
        // 3
        view = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseID)
        view.canShowCallout = true
        view.isUserInteractionEnabled = true
        view.calloutOffset = CGPoint(x: -5, y: 5)
        view.rightCalloutAccessoryView = UIButton.init(type: .detailDisclosure) as UIButton
      }
      return view
    }
    return nil
  }

  func mapView(mapView: MKMapView, annotationView view: MKAnnotationView!, calloutAccessoryControlTapped control: UIControl!) {
    if control == view.rightCalloutAccessoryView {
      print(view.annotation?.title)
      performSegue(withIdentifier: "moreDetail", sender: self)
    }

  }


  func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if (segue.identifier == "moreDetail") {
      // pass data to next view
      let destViewController:PancakeHouseViewController = segue.destination as! PancakeHouseViewController
      destViewController.viaSegue = sender as! MKAnnotationView
    }
  }

}
  

Я также включил переменную в свой контроллер детального просмотра (PancakeHouseViewController)… Я не знаю, должен ли он быть там или нет.

 var viaSegue = MKAnnotationView()
  

Комментарии:

1. привязанный переход — это правильный тип перехода?

2. правильно. Просто ничего не происходит, когда я нажимаю кнопку раскрытия деталей.

Ответ №1:

Я полагаю, что проблема может быть просто в сигнатуре метода для calloutAccessoryControlTapped . Это должно быть:

 func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl)
  

Комментарии:

1. Удалив ! в UIControl кнопка раскрытия деталей по-прежнему не активируется и не переходит к PancakeHouseViewController

2. Вы добавили _ перед mapView аргументом?

3. Ого!! Это сработало!! Но он предоставляет мне только PancakeHouseViewController по умолчанию… Не тот, который связан с каждой конкретной блинной.

4. Вам нужно будет настроить метод PancakeHouseViewController внутри prepareForSegue .

5. функция prepareForSegue(segue: UIStoryboardSegue, отправитель: AnyObject?) { if (segue.identifier == «Подробнее») { // передайте данные в следующий просмотр, пусть destViewController:PancakeHouseViewController = segue. назначение как! PancakeHouseViewController destViewController.viaSegue = отправитель как! MKAnnotationView } }