Подтвердить что ты не робот

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

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

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

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

-(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 таким образом. Но я все еще не могу получить выносок со своего булавки, а штырь остается красным. Но это должно быть фиолетовым ничего вообще

4b9b3361

Ответ 1

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

  • Откройте свой ниб
  • Щелкните правой кнопкой мыши на MapView
  • Перетащите делегат в файловый менеджер

Ответ 2

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

До:

[_mMapView addAnnotation:marker];

После:

dispatch_async(dispatch_get_main_queue(), ^{
     [_mMapView addAnnotation:marker];
});

Ответ 3

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

- (void)viewDidLoad {

    [super viewDidLoad];
    mapView.delegate=self;
}

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

Ответ 8

Я работал в приложении iOS 9 Mapview, и я испытал ту же проблему.

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

Ответ 9

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