Пользовательская аннотация MKPointAnnotation не реагирует на взаимодействие с пользователем

Я делаю приложение Swift, которое использует MKPointAnnotations, и недавно столкнулся с проблемой, когда мне нужно было хранить метаданные в моих аннотациях, поэтому я создал пользовательский класс ниже:

class BRETTFAnnotation: MKPointAnnotation {

    var tag: Int64

    var name: String

    init(lat : Double, lon:Double, t : Int64, n: String) {

        self.tag = t
        self.name = n

        super.init()


        self.coordinate = CLLocationCoordinate2D(latitude: lat, longitude: lon)
    }

}

Мой метод MKAnnotationView viewfor MKAnnotation показан ниже:

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
    let newAnnotation = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "reuse")

    newAnnotation.canShowCallout = true

    let right = self.button(title: "Yes")
    right?.addTarget(self, action: #selector(clickedToConfirmNewPoint), for: .touchUpInside)
    newAnnotation.rightCalloutAccessoryView = right

    let left = self.button(title: "No")
    left?.addTarget(self, action: #selector(clickedToCancelNewPoint), for: .touchUpInside)
    newAnnotation.leftCalloutAccessoryView = left

    return newAnnotation
}

Проблема, с которой я сталкиваюсь, заключается в том, что когда я нажимаю на свой собственный BRETTFAnnotation (который я добавляю к своему MKMapView), ничего не происходит. Когда я просто использовал MKPointAnnotation (вместо BRETTFAnnotation), когда я нажимал на карту, отображались две кнопки на MKAnnotationView. Я пытаюсь заставить MKPinAnnotationView отображаться при касании, используя BRETTFAnnotation вместо MKPointAnnotation.

Как я могу продолжать использовать свою пользовательскую аннотацию и отображать выноску, когда пользователь одновременно нажимает аннотацию?

Редактировать 1: поскольку это, вероятно, полезно, приведенный ниже код - это то, как я делаю аннотацию и добавляю ее в mapView.

        let location = gestureRecognizer.location(in: mapView)
        let coordinate = mapView.convert(location,toCoordinateFrom: mapView)

        print("adding lat,long \(coordinate.latitude),\(coordinate.longitude)")


        lastPoint = BRETTFAnnotation(lat: coordinate.latitude, lon: coordinate.longitude, t: 1, n: "")

        let annotationView = MKPinAnnotationView(annotation: lastPoint, reuseIdentifier: "reuse")

        mapView.addAnnotation(lastPoint)

person brettfazio    schedule 20.05.2017    source источник
comment
что именно вы хотите сделать? Используйте mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) для обработки кликов для аннотаций.   -  person kuzdu    schedule 20.05.2017
comment
@kuzdu Я не использовал это раньше, но сейчас, когда я нажимаю на свою пользовательскую аннотацию, выноска не отображается. Я просто пытаюсь обрабатывать клики для пользовательской аннотации, используя любой метод, если тот, на который вы ссылались, будет работать, объясните, как это сделать.   -  person brettfazio    schedule 20.05.2017


Ответы (2)


Когда вы используете свою собственную MKAnnoation, вы можете обрабатывать свои действия в didSelect. Просто реализуйте следующий код.

func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
    if let yourAnnotation = view.annotation as? BRETTFAnnotation {
       //handle your meta data or/and show UIViews or whatever
    }
}

с

func mapView(_ mapView: MKMapView, didDeselect view: MKAnnotationView) {
    //getting called when you tap on map or on another annotation (not the selected annotation before) 
    //hide UIViews or do whatever you want
 }

Это работает для меня:

class ViewController: UIViewController, MKMapViewDelegate {

    func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {


    print("didSelect")
    if let annoation = view.annotation as? MyAnnoation {
        print("metatag \(annoation.metaTag)")
    }
}

func mapView(_ mapView: MKMapView, didDeselect view: MKAnnotationView) {
    print("didDeselect")
}

override func viewDidLoad() {
    super.viewDidLoad()


    mapView.delegate = self
    let annotation = MyAnnoation(n: "name", m: "metaTag")
    annotation.coordinate = CLLocationCoordinate2D(latitude: 50.0, longitude: 8.0)
    mapView.addAnnotation(annotation)
   }
 }



class MyAnnoation: MKPointAnnotation {


var name: String?
var metaTag: String?


init(n: String, m: String) {
    self.name = n
    self.metaTag = m
  }
}
person kuzdu    schedule 20.05.2017
comment
Ваш первый метод, похоже, не отвечает на мои клики по моим аннотациям (я добавил оператор печати, и при нажатии ничего не печаталось). Может ли это означать, что я просто делаю что-то не так где-то еще или это все еще связано с моим пользовательским классом? - person brettfazio; 20.05.2017
comment
Также мой пользовательский BRETTFAnnotation является подклассом MKPointAnnotation, а не MKAnnotationView (хотя я не знаю, имеет ли это значение). - person brettfazio; 20.05.2017
comment
Вы установили mapview.delegate = self ? DidSelect не отвечает или оператор внутри let? - person kuzdu; 20.05.2017
comment
Да, я сделал это в своем представленииDidLoad() - person brettfazio; 20.05.2017
comment
Я отредактировал свой вопрос, указав, как я создал/добавил свою аннотацию, чтобы вы могли найти там что-то не так. - person brettfazio; 20.05.2017

Я исправил эту проблему, сделав мой BRETTFAnnotation подклассом NSObject и MKAnnotation вместо MKPointAnnotation. Это позволило моему пользовательскому классу получать взаимодействие с пользователем и отображать выноски.

person brettfazio    schedule 20.05.2017