Ответ 1
У меня была та же проблема, которая не задавала делегату MapView файловому владельцу.
- Откройте свой ниб
- Щелкните правой кнопкой мыши на MapView
- Перетащите делегат в файловый менеджер
Я пытаюсь создать карту, где я могу увидеть свое текущее местоположение и посмотреть, что называется улицей.
до сих пор я могу поместить булавку на свою карту, но по какой-то причине я не получаю выноску. и я поместил 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 таким образом. Но я все еще не могу получить выносок со своего булавки, а штырь остается красным. Но это должно быть фиолетовым ничего вообще
У меня была та же проблема, которая не задавала делегату MapView файловому владельцу.
У меня была такая же проблема, как вы упомянули. Делегат был настроен на ViewController, но селектор viewForAnnotation
не вызывался. После некоторых проверок я понял, что если вы не вызываете addAnotation
в основном потоке, mapView не будет вызывать viewForAnnotation
, поэтому после обновления будет решена моя проблема:
До:
[_mMapView addAnnotation:marker];
После:
dispatch_async(dispatch_get_main_queue(), ^{
[_mMapView addAnnotation:marker];
});
Чтобы получить вызов viewForAnnotation
, добавьте mapView.delegate=self;
, например. метод viewDidLoad
:
- (void)viewDidLoad {
[super viewDidLoad];
mapView.delegate=self;
}
Может быть, ваша аннотация добавлена за пределы текущей области просмотра MKMapView?
Для раскадровки Ctl перетащите MKMapView в оранжевый круг на нижней панели ViewController и выберите делегат.
Это решит проблему.
Другие уже объяснили, что шансы высоки, вы не связали свой делегат mapview с вашим контроллером. Его первое, что нужно проверить
Как упоминается в комментариях vatrif, вы должны установить делегат ПЕРЕД добавление аннотаций к вашему объекту MKMapView.
Я работал в приложении iOS 9 Mapview, и я испытал ту же проблему.
каким-то образом я решил свою проблему, в моем случае изменяя размер mapview
.
Я добавил delegate
после изменения размера mapview
. он отлично работает.!
После задания делегата для mapview, если все же viewforannotation не будет вызван, тогда это то, что вы пропустили, - установите self.mapView.showsUserLocation в YES, в построителе интерфейса вы можете пометить опцию show userLocation в инспекторе атрибутов.