2010-03-14 1 views
3

Я хочу отобразить синюю пульсирующую точку для местоположения пользователя. Я делаю это:Как отобразить местоположение пользователя в mapkit?

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

Но я в конечном итоге получить

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

Должен ли я делать это какой-то другой способ?

- EDIT -

Я также делаю это, где я в конечном итоге получить вышеуказанное исключение:

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

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

заведения является пользовательским классом я на AddressNote. Когда значение заведения имеет значение, возникает исключение. Если я не устанавливаю ShowsUserLocation, все работает нормально, но, конечно, я не вижу местоположение пользователя.

ответ

8

Не знаете, в чем проблема, но вам не нужно делать это при каждом обновлении. Установите его один раз после создания mapView, и вы должны быть в бизнесе.

mapView.showsUserLocation = YES; 

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

+0

Спасибо. Теперь я делаю это в viewDidLoad, но получаю то же исключение. Я обновил этот вопрос, чтобы отразить еще несколько деталей. Если я не устанавливаю местоположение, он работает нормально. – 4thSpace

+1

Я предлагаю вам разделить его на голый MKMapView и установить на нем соответствующие параметры. Пропустите аннотацию и материал CLLocationManager, обработку событий и т. Д. Когда у вас есть эта работа, начните добавлять остальную часть назад, и когда проблема снова появится, вы лучше поймете, где она находится. –

15

При запросе viewForAnnotation вам необходимо проверить, не соответствует ли данная аннотация, соответствует ли текущее местоположение пользователя. Если да, верните нуль, в противном случае верните свой собственный обычный annoationView.

 
- (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] альтернативный способ проверить вид класса аннотации:

 
- (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

Это избавляет от исключения, но пульсирующая синяя точка не появляется. Я предполагаю, что это потому, что я возвращаю ноль? Должен ли быть возвращен какой-то вид? – 4thSpace

+1

вы на 100% уверены, что при вызове [self.mapView setShowsUserLocation: YES]; ваш mapView не ноль? Я возвращаю нуль в свой код и получаю синюю точку:/ – yonel

+0

Я согласен с yonel - это почти идентично используемому мне коду (я проверяю класс аннотации, а не равен ли он аннотации местоположения) и синяя точка появляется на моей карте. –

0

Вы используете неправильный метод делегата. Для mapview вы должны использовать этот метод делегата, чтобы поймать местоположение пользователя:

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

 Смежные вопросы

  • Нет связанных вопросов^_^