ViewForAnnotation не вызывается - PullRequest
       2

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

19 голосов
/ 29 сентября 2010

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

На данный момент я могу прикрепить булавку к своей карте, но для некоторыхпричина, я не получаю выноску.и я добавил NSLog в метод viewForAnnotation, но он не вызывается, поэтому я не смог его протестировать.

Может ли кто-нибудь мне помочь?

-(void)lat:(float)lat lon:(float)lon
{
    CLLocationCoordinate2D location;
    location.latitude = lat;
    location.longitude = lon;
    NSLog(@"Latitude: %f, Longitude: %f",location.latitude, location.longitude);
    //One location is obtained.. just zoom to that location

    MKCoordinateRegion region;
    region.center=location;
    //Set Zoom level using Span
    MKCoordinateSpan span;
    span.latitudeDelta=.005f;
    span.longitudeDelta=.005f;
    region.span=span;
    [map setRegion:region animated:TRUE];

    //MKReverseGeocoder *geocoder=[[MKReverseGeocoder alloc] initWithCoordinate:location];
    //geocoder.delegate=self;
    //[geocoder start];
    if (cPlacemark != nil) {
        [map removeAnnotation:cPlacemark];
    }
    cPlacemark=[[CustomPlacemark alloc] initWithCoordinate:location];
    cPlacemark.title = mPlacemark.thoroughfare;
    cPlacemark.subtitle = mPlacemark.locality;
    [map addAnnotation:cPlacemark];
    [cPlacemark release];

    [mLocationManager stopUpdatingLocation];
}

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {
if ([annotation isKindOfClass:[MKUserLocation class]])
    return nil;

// try to dequeue an existing pin view first
if ([annotation isKindOfClass:[CustomPlacemark class]]){
MKPinAnnotationView *pinView=(MKPinAnnotationView *)[map dequeueReusableAnnotationViewWithIdentifier:@"customIdentifier"];

if (!pinView)
{
    // if an existing pin view was not available, create one
    MKPinAnnotationView* cPinAnnoView = [[[MKPinAnnotationView alloc]
                                           initWithAnnotation:annotation reuseIdentifier:@"customIdentifier"] autorelease];
    cPinAnnoView.pinColor = MKPinAnnotationColorPurple;
    cPinAnnoView.animatesDrop = YES;
    cPinAnnoView.canShowCallout = YES;
    // Add button
    UIButton *leftButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
    [leftButton addTarget:self action:@selector(annotationViewClick:) forControlEvents:UIControlEventTouchUpInside];
    cPinAnnoView.leftCalloutAccessoryView = leftButton;

} else
    {
        pinView.annotation = annotation;
    }
    return pinView; 
}
return nil;

}

Прямо сейчас я настроил свой viewForAnnotation так, как это.Но я все еще не могу получить выноску из моего булавки, и булавка остается красной.Но это должно быть фиолетовым из ничего

Ответы [ 9 ]

32 голосов
/ 21 февраля 2012

У меня была та же проблема, что не было назначение делегата MapView владельцу файла.

  1. Откройте перо
  2. Щелкните правой кнопкой мыши на MapView
  3. Перетащите делегата в Владелец файла
23 голосов
/ 08 декабря 2013

У меня была такая же проблема, как вы упомянули.Делегат был установлен на ViewController, но селектор viewForAnnotation не вызывался.После некоторых проверок я понял, что если вы не вызовете addAnotation в основном потоке, mapView не вызовет viewForAnnotation, поэтому следующее обновление решило мою проблему:

До:

[_mMapView addAnnotation:marker];

После:

dispatch_async(dispatch_get_main_queue(), ^{
     [_mMapView addAnnotation:marker];
});
7 голосов
/ 30 декабря 2011

Чтобы получить вызываемый viewForAnnotation, добавьте mapView.delegate=self;, например, к методу viewDidLoad:

- (void)viewDidLoad {

    [super viewDidLoad];
    mapView.delegate=self;
}
5 голосов
/ 29 сентября 2010

Может ли быть так, что ваша аннотация была добавлена ​​за пределы текущей области просмотра MKMapView?

2 голосов
/ 06 февраля 2015

Для раскадровки, перетащите MKMapView в оранжевый круг на нижней панели ViewController и выберите делегата.

Это решит проблему.

1 голос
/ 30 января 2016

Как упоминалось в комментариях vatrif, вы должны установить свой делегат ДО , добавив аннотации к вашему объекту MKMapView.

1 голос
/ 31 января 2013

Другие уже объяснили, что шансы высоки, вы не подключили своего делегата mapview к контроллеру. Это первое, что нужно проверить

0 голосов
/ 05 октября 2016

После установки делегата для просмотра карты, если видимость по-прежнему не вызывается, это то, что вы пропустили - установите для self.mapView.showsUserLocation значение YES, в конструкторе интерфейса вы можете отметить опцию show userLocation в инспекторе атрибутов.

0 голосов
/ 21 июля 2016

Я работал в приложении ios 9 Mapview и столкнулся с той же проблемой.

каким-то образом я решил свою проблему, в моем случае я изменяю размер mapview. Я добавил delegate после изменения размера mapview. теперь работает отлично.!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...