MKUserLocation синий userLocation MKAnnotation вызывает сбой приложения в случае непреднамеренного касания - PullRequest
5 голосов
/ 01 февраля 2012

У меня есть MKMap с серией MKAnnotations, все из которых красные, что нормально.Я выбрал «показать местоположение пользователя» в IB и изменил MKAnnotation с красного на синий, у меня есть код в моем методе viewForAnnotation:

if (annotation == theMap.userLocation)
    return nil;

Все хорошо, и приложение работает нормально, но если пользователь случайно коснется синей точки расположения пользователя, я получаю следующее падение:

2012-02-01 20:43:47.527 AusReefNSW[27178:11603] -[MKUserLocationView setPinColor:]: unrecognized selector sent to instance 0x79b0720
2012-02-01 20:43:47.528 AusReefNSW[27178:11603] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[MKUserLocationView setPinColor:]: unrecognized selector sent to instance 0x79b0720'
*** First throw call stack:

Если я удаляю приведенный выше код, все работает хорошо, но вывод красный.Я предпочитаю иметь синий значок, но пока не выяснил, почему происходит сбой.Любые идеи были бы хорошы.Спасибо.

решено!Спасибо Марвину и вот этот код, если кто-нибудь найдет его полезным.Короче говоря, мне пришлось сначала проверить, относится ли MKAnnotation к классу MyAnnotation или к классу MKUserLocation.

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKPinAnnotationView *)view
{
 theAnnotationSelected = [[mapView selectedAnnotations] objectAtIndex:0];
if ([theAnnotationSelected isKindOfClass:[MyAnnotation class]] ) 
{
view.pinColor = MKPinAnnotationColorGreen;

}
- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKPinAnnotationView *)view
{
if ([theAnnotationSelected isKindOfClass:[MyAnnotation class]] ) 
{
view.pinColor = MKPinAnnotationColorRed;
}

Ответы [ 4 ]

23 голосов
/ 01 февраля 2012

Для текущего местоположения пользователя перейдите к свойству MKMapView и сделайте выбор на Показывает местоположение пользователя в XIB.

затем внедрите MKMapViewDelegate в свой контроллер ... и запишите этот метод в свой контроллер

-(MKAnnotationView *)mapView:(MKMapView *)pmapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    if ([annotation isKindOfClass:[MKUserLocation class]])
        return nil;  //return nil to use default blue dot view

    if([annotation isKindOfClass:[MKAnnotationClass class]])
    {
        //Your code
    }
}

и это

- (void)mapView:(MKMapView *)mapView1 didSelectAnnotationView:(MKAnnotationView *)customAnnotationView
{

    if(![annotation isKindOfClass:[MKUserLocation class]])
    {
          //Your code
    }

}

Используя это, вы можете увидеть синюю точку в местоположении пользователя.

9 голосов
/ 01 февраля 2012

Вы хотите проверить класс аннотации в

-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view{

Затем выполните следующее ..

id *annotation = view.annotation;
    if (![annotation isKindOfClass:[MKUserLocation class]]) {
//Normal Code here
}
1 голос
/ 07 октября 2015

У меня была такая же проблема, что когда пользователь нажимал «синюю точку» MKUserlocation, приложение зависало.Я использую DDAnnotation от Ching-Lan 'digdog' HUANG.Исправление, которое я нашел, было

-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view{
id annotation = view.annotation;
    if (![annotation isKindOfClass:[MKUserLocation class]]) {
//Your Annotation Code here
}
}
1 голос
/ 01 февраля 2014

Это решение работает в iOS7 для подавления представления выноски, но оно не останавливает пользователя от выбора синей точки. Как подавить выноску «Текущее местоположение» в виде карты

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

Это не столько обходной путь, сколько «способ справиться с этим», но я увеличиваю карту, чтобы сосредоточиться на определенных типах аннотаций при нажатии.Если пользователь находится прямо над ним, масштабирование помогает установить некоторое расстояние между синей точкой и моей аннотацией, облегчая касание.

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view {

if([view.annotation isKindOfClass:[SpecialClass class]]){

    SpecialClass *cluster = (SpecialClass *)view.annotation;
    if(testCriteria){
        [self.mapView setRegion:MKCoordinateRegionMakeWithDistance(cluster.coordinate, cluster.radius, cluster.radius) animated:YES];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...