Проблемы с MapView - Пин меняет цвет при перерисовке карты

У меня проблема с отображением цветов PIN-кода при обновлении. В моем приложении я отображаю точку двумя цветами, чтобы определить, доступна ли услуга. При первом запуске проблем не возникает. Код является следующим:

    - (void)viewDidLoad
{
    [super viewDidLoad];
    [self dowloadPoint];    // here I exucte the first start 

}

- (void)dowloadPoint{
    NSURL *url1 =[NSURL URLWithString:@"http:MYUSRL"];
    NSData *datos1 =[[NSData alloc] initWithContentsOfURL:url1];

        [self plotBarPosition:datos_string1];     //Here I call the plotBarPosition method
}


- (void)plotBarPosition:(NSString *)datos_string1 {

    for (id<MKAnnotation> annotation in _mapView.annotations) {
        [_mapView removeAnnotation:annotation];
    }

    // Parse the string into JSON
    NSDictionary *json = [(NSDictionary*)[datos_string1 JSONValue]objectForKey:@"features"];

    // Get the objects you want, e.g. output the second item's client id
    NSArray *items_properties = [json valueForKeyPath:@"properties"];
    NSArray *items_geo = [json valueForKeyPath:@"geometry"];

        for (int i = 0; i < [json count]; i++){

            NSString *nomprePunto =[[items_properties objectAtIndex:i] objectForKey:@"title"]; 

            NSNumber *lat =[[[items_geo objectAtIndex:i] objectForKey:@"coordinates"] objectAtIndex:0];


            NSNumber *lon =[[[items_geo objectAtIndex:i] objectForKey:@"coordinates"] objectAtIndex:1];

            CLLocationCoordinate2D coordinate;
            coordinate.latitude = lat.doubleValue;
            coordinate.longitude = lon.doubleValue;

            //ESTADO
            NSString *description = [[items_properties objectAtIndex:i] objectForKey:@"description"];
            NSString *estado_punto = [[NSString alloc]init];

            if ([description rangeOfString:@"Averiado"].location == NSNotFound) {
                estado_punto = @"Available";
            } else {
                estado_punto = @"NOt Available";
                averiados ++;
             }
            NSString *averiadosStr = [NSString stringWithFormat:@"%d",averiados];
           averiadosLabel.text = averiadosStr;

            MyLocation *location =[[MyLocation alloc] initWithName:nomprePunto coordinate:coordinate estado:estado_punto];

            [_mapView addAnnotation:location];
    }


}



- (MKPinAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(MyLocation *)annotation {

        static NSString *identifier = @"MyLocation";
        if ([annotation isKindOfClass:[MyLocation class]]) {
            MKPinAnnotationView *annotationView = (MKPinAnnotationView *) [_mapView dequeueReusableAnnotationViewWithIdentifier:identifier];

            if (annotationView == nil) {
                annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];

                annotationView.enabled = YES;
                annotationView.canShowCallout = YES;

                if([[annotation estado] isEqualToString:@"En Servicio"])
                annotationView.pinColor = MKPinAnnotationColorGreen;

                } else {
                annotationView.annotation = annotation;
            }

            return annotationView;
        }

        return nil;
    }

Но когда я добавляю кнопку refres, которая является функцией, это просто повторный вызов dowloadPoint,

- (IBAction)refresh{

    [self dowloadPoint];
}

цвет булавок меняется «случайным образом», не соответствующим реальному состоянию точки. Есть идеи о том, что происходит? Заранее спасибо.

РЕДАКТИРОВАТЬ: Кажется, проблемы связаны с:

for (id<MKAnnotation> annotation in _mapView.annotations) {
    [_mapView removeAnnotation:annotation];
}

стирая его, приложение работает правильно, но область контактов тонет над предыдущими ...: S


person doxsi    schedule 27.03.2013    source источник


Ответы (1)


Цвет булавки по умолчанию — красный. Вы устанавливаете его зеленым цветом, если свойство estado вашего объекта MyLocation равно @"En Servicio". Я понимаю, что иногда цвет красный, когда ваше свойство estado равно @"En Servicio", а иногда зеленый, когда это не так.
Одной из причин может быть то, что ваш объект MyLocation просто больше не существует, когда вы нажимаете кнопку обновления. В этом случае у вас все еще может быть указатель на ячейку памяти, где она когда-то существовала, но эта ячейка могла быть чем-то перезаписана, что привело к случайному цвету.
Это может произойти, например. если ваш объект MyLocation был создан как объект автоматического освобождения, который был освобожден, когда вы вернулись в основной цикл событий, т. е. для обработки взаимодействия с пользователем.
Этого не должно быть, если вы используете ARC.

person Reinhard Männer    schedule 27.03.2013
comment
Привет. Спасибо за ответ. Я использую ARC, поэтому проблема не зависит от версии, не так ли? - person doxsi; 27.03.2013
comment
Привет, у меня есть еще одна идея: документы справочника классов MKAnnotationView говорят о его свойстве аннотации: вы не должны напрямую изменять значение этого свойства. Но вы делаете это в операторе annotationView.annotation = annotation;. Может из-за этого проблема? - person Reinhard Männer; 27.03.2013
comment
проблема кажется из-за использования: for (id‹MKAnnotation›аннотации в _mapView.annotations) { [_mapView removeAnnotation:annotation]; } Если я удалю его, он будет работать правильно, но булавки утонут над предыдущими. - person doxsi; 28.03.2013