DidSelectAnnotationView не вызывается

Я хотел бы работать с аннотацией после ее щелчка. Я посмотрел его на документацию Apple, и я сделал googled, но я не могу найти, почему это ничем не отличается от того, как это должно быть сделано. В основном; Я не получаю println("Pin clicked");

Почему бы и нет?

    func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView!
{
    if !(annotation is MKPointAnnotation) {

        return nil
    }

    let reuseId = "test"

    var anView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId)
    if anView == nil {
        anView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
        anView.canShowCallout = true

    }
    else {
        anView.annotation = annotation
    }

    return anView
}
func mapView(mapView: MKMapView!, didSelectAnnotationView view: MKAnnotationView!)
{
    println("Pin clicked");
}
func setAnnotationPinOnMap(annotation : NSManagedObject)
{

    var subject: AnyObject? = annotation.valueForKey("subject")
    var desc: AnyObject? = annotation.valueForKey("desc")
    var langitude: AnyObject? = annotation.valueForKey("langitude")
    var longitude: AnyObject? = annotation.valueForKey("longitude")
    println(annotation);
    let pin = MKPointAnnotation()

    let location = CLLocationCoordinate2D(
        latitude: longitude as CLLocationDegrees,
        longitude: langitude as CLLocationDegrees
    )
    println(location.longitude, location.latitude)
    pin.setCoordinate(location)
    pin.title = subject as String!
    pin.subtitle = desc as String!
    println( pin.coordinate.longitude)
    viewForAnnotation(pin);
    mapView.addAnnotation(pin)
}

Я импортировал набор карт и включил делегат отображения карты.

Ответ 1

Чтобы ответить на исходный вопрос, didSelectAnnotationView, скорее всего, не получил вызов, потому что свойство map view delegate не было установлено. Другая общая причина заключается в том, что аннотация title пуста.

В обновленном вопросе контакты не будут отображаться с помощью способа viewForAnnotation, поскольку он создает MKAnnotationView, но не устанавливает его свойство image. Свойство image для MKAnnotationView по умолчанию равно nil, поэтому контакты там, но невидимы.

Если вы хотите отображать стандартные красные контакты, выполните следующие действия:

  • Не используйте метод делегата viewForAnnotation вообще, и по умолчанию на карте будут отображаться красные контакты.
  • Внедрите метод делегата viewForAnnotation и создайте вместо него MKPinAnnotationView, который автоматически отобразит "контактный" образ.

Итак, либо установите контакт image на какое-то пользовательское изображение:

anView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
anView.canShowCallout = true
anView.image = UIImage(named:"CustomImage")  // <-- add this line

или создайте вместо него MKPinAnnotationView и, возможно, установите его pinColor:

var anView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId) as? MKPinAnnotationView
if anView == nil {
    anView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
    anView!.canShowCallout = true
    anView!.animatesDrop = true
    anView!.pinColor = .Purple  // or Red or Green
}
else {
    anView!.annotation = annotation
}

Ответ 2

В моем случае проблема заключалась в том, что я устанавливал свойство canShowCallout в YES, поэтому, если вы установите это свойство в YES

-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view

не вызывается. когда я удалил это свойство, метод был вызван.

annotationView = [[ClusterAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
annotationView.canShowCallout = YES; //try setting to NO or don't set.

Ответ 3

В моем случае я использовал аннотацию костюма, и didSelectAnnotationView не вызывался из-за того, что свойство изображения для аннотации custome было пустым, поэтому я установил его в изображение и начал вызывать didSelectAnnotationView.

- (id)initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier{
    self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];
    if (self != nil)
    {
        DoctorCustomeAnnotation *mapItem = (DoctorCustomeAnnotation *)self.annotation;

        // offset the annotation so it won't obscure the actual lat/long location
        self.centerOffset = CGPointMake(100, 100.0);
        self.backgroundColor = [UIColor redColor];
        PAImageView* avatarView = [[PAImageView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)
                                             backgroundProgressColor:[UIColor whiteColor]
                                                       progressColor:[UIColor colorWithRed:0.092 green:0.383 blue:0.580 alpha:1.000]];
        [self addSubview:avatarView];
        self.image = [UIImage imageNamed:@"placeholder_male"];
        [avatarView setImageURL:@"http://www.straine.com/wp-content/uploads/2015/12/doctor.png"];
    }
    return self;
}

Ответ 4

Я хотел добавить это в качестве комментария к ответу GOrozco58, но не имеет достаточной репутации для комментариев.

GOrozco58 прав, если у вас canShowCallout установлено значение YES, didSelectAnnotation не будет вызываться, если заголовок равен нулю.

Если вы хотите, чтобы didSelectAnnotation был вызван, а также установите canShowCallout на YES, убедитесь, что вы добавили заголовок.

Ответ 5

В последней версии Swift объявление метода изменилось:

func mapView(mapView: MKMapView!, didSelectAnnotationView view: MKAnnotationView!)

:

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

Ответ 6

Предложение о назначении аннотации, которое не было назначено, было решением моей проблемы. Мне потребовалась минута, чтобы реализовать это, и я сделал это в функции gestureRecognizer(). Вот мой пример:

    @objc func handleLongPress(_ gestureRecognizer : UIGestureRecognizer) {
    if gestureRecognizer.state != .began { return }
    print("Tap gesture recognized")

    // Create the annotation
    let touchPoint = gestureRecognizer.location(in: mapView)
    let newCoordinate = self.mapView.convert(touchPoint, toCoordinateFrom:self.mapView)
    let annotation = MKPointAnnotation()
    annotation.coordinate = newCoordinate
    annotation.title = "placeholder"

    // Add the annotation
    mapView.addAnnotation(annotation)
}