2010-03-14 5 views
3

Je voudrais afficher le point d'impulsion bleu pour l'emplacement d'un utilisateur. Je fais ceci:Comment afficher l'emplacement de l'utilisateur dans mapkit?

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{ 
//some other stuff here 
[self.mapView setShowsUserLocation:YES]; 
} 

Mais je finalement obtenir

-[MKUserLocation establishment]: unrecognized selector sent to instance 0x125e90 

Dois-je faire cela d'une autre façon?

- EDIT -

Je fais aussi ce qui est là que je reçois finalement l'exception ci-dessus:

- (MKAnnotationView *) mapView:(MKMapView *)_mapView viewForAnnotation:(AddressNote *) annotation{ 

if(annotation.establishment != nil){ 
//do something} 

établissement est une classe personnalisée que j'ai sur AddressNote. Lorsque l'établissement a une valeur, l'exception se produit. Si je ne définis pas ShowsUserLocation, tout fonctionne bien, mais bien sûr, je ne vois pas l'emplacement de l'utilisateur.

Répondre

8

Je ne sais pas quel est le problème réel est, mais vous n'avez pas besoin de le faire sur chaque mise à jour. Réglez-le une fois après avoir créé le mapView, et vous devriez être en affaires.

mapView.showsUserLocation = YES; 

Vous pourriez avoir besoin de zoomer sur la carte de la région où l'utilisateur est en fait, pour le point d'être visible.

+0

Merci. Je le fais maintenant dans viewDidLoad mais je reçois la même exception. J'ai mis à jour la question pour refléter quelques détails supplémentaires. Si je ne définis pas l'emplacement, cela fonctionne bien. – 4thSpace

+1

Je vous suggère de le réduire à un MKMapView nu et définir les options pertinentes à ce sujet. Ignorez les annotations et les éléments CLLocationManager, la gestion des événements, etc. Lorsque cela fonctionne, commencez à ajouter le reste, et lorsque le problème réapparaîtra, vous aurez une meilleure idée de l'endroit où il se trouve. –

15

Lorsque le viewForAnnotation est demandé, vous devez vérifier si oui ou non l'annotation donnée correspond à l'emplacement de l'utilisateur actuel. Si oui, renvoyez zéro, sinon retournez votre propre annoationView normale.

 
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id)annotation { 
    if (annotation==self.mapView.userLocation) 
     return nil; 
    //then the rest of your code for all your 'classic' annotations.

[EDIT] une autre façon est de vérifier le type de la classe de l'annotation:

 
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id)annotation { 
    if ([annotation isKindOfClass:[MKUserLocation class]]) 
     return nil; 
    //then the rest of your code for all your 'classic' annotations. 

+0

Cela supprime l'exception, mais le point bleu pulsant n'apparaît pas. Je suppose que c'est parce que je reviens nul? Ne devrait-il pas y avoir un certain type de vue? – 4thSpace

+1

êtes-vous sûr à 100% que lorsque vous invoquez [self.mapView setShowsUserLocation: YES]; votre mapView n'est pas nul? Je retourne nul dans mon code et je reçois le point bleu:/ – yonel

+0

Je suis d'accord avec yonel-ce est presque identique au code que je utilise (je vérifie plutôt que la classe de l'annotation si elle est égale à l'annotation de l'emplacement), et le point bleu apparaît sur ma carte. –

0

Vous utilisez la mauvaise méthode de délégué. Pour mapview, vous devez utiliser cette méthode de délégué pour attraper l'emplacement de l'utilisateur:

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation 
{ 
}