MapKit обновляет изображение аннотации - PullRequest
2 голосов
/ 03 июля 2011

У меня проблема с поиском способа обновления пользовательского изображения MKAnnotationView после завершения асинхронного запроса с информацией о состоянии аннотации. Пока у меня есть это:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {

    static NSString *identifier = @"EstacionEB";   
    if ([annotation isKindOfClass:[EstacionEB class]]) {
        EstacionEB *location = (EstacionEB *) annotation;

        CustomPin *annotationView = (CustomPin *) [_mapita dequeueReusableAnnotationViewWithIdentifier:identifier];
        if (annotationView == nil) {
            annotationView = [[CustomPin alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
        } else {
            annotationView.annotation = annotation;
        }

        UIImage * image = [UIImage imageNamed:[NSString stringWithFormat:@"%@.png", [location elStatus]]];

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

        NSDictionary *temp = [[NSDictionary alloc] 
                              initWithObjects:[NSArray arrayWithObjects:annotationView, location, nil]
                              forKeys:[NSArray arrayWithObjects:@"view", @"annotation", nil]
                              ];
        //This array is synthesized and inited in my controller's viewDidLoad
        [self.markers setObject:temp forKey:location.eid];
        return annotationView;
    }

    return nil;    
}

Чуть позже я делаю запрос и с результатами, NSDictionary, я пытаюсь сделать следующее, который возвращает ноль обоим элементам:

- (void)updateStation:(NSString *)eid withDetails:(NSDictionary *)details
{
    NSInteger free = [details objectForKey:@"free"];
    NSInteger parkings = [details objectForKey:@"parkings"];

    NSDictionary *storedStations = [self.markers objectForKey:eid];

    CustomPin *pin = [storedStations objectForKey:@"view"]; //nil
    EstacionEB *station = [referencia objectForKey:@"annotation"]; //nil as well

    [station setSubtitle:free];

    NSString *status;
    if( free==0 ){
        status = @"empty";
    } else if( (free.intValue>0) && (parkings.intValue<=3)  ){
        status = @"warning";
    } else {
        status = @"available";
    }
    UIImage * image = [UIImage imageNamed:[NSString imageWithFormat:@"%@.png", status]];
    pin.image = image;
}

Это не вызывает никаких ошибок (при условии, что я вставил и перераспределил все правильно), но NSMutableDictionary, который должен содержать как мой пользовательский MKAnnotationView, так и MKAnnotation, но даже когда я регистрирую их все до завершения запроса, и он отображается правильно, когда request завершает свою работу так, как если бы MKAnnotationView и MKAnnotation просто не соответствовали моим ожиданиям, и поэтому я не могу изменить аннотации для изменения изображения или обновления аннотации.

Любые идеи будут оценены!

1 Ответ

6 голосов
/ 03 июля 2011

Я не уверен, почему вы получаете нулевые значения из массива маркеров (особенно для аннотаций). Однако я не рекомендую хранить ссылку на представление аннотации таким образом.

Метод делегата viewForAnnotation может вызываться представлением карты в любое время, когда он считает это необходимым, и объект представления может переходить от одного вызова к другому. Поскольку вы также повторно используете представления аннотаций, используя один и тот же идентификатор повторного использования для каждой аннотации, существует также вероятность того, что этот же объект представления может быть повторно использован для другой аннотации позже.

Вместо этого в updateStation я предлагаю следующее:

  • цикл по массиву annotations вида карты
  • если аннотация имеет тип EstacionEB, то проверьте, соответствует ли ее eid обновляемой
  • обновить свойства аннотации subTitle и elStatus (важно обновить elStatus, потому что он используется методом делегата viewForAnnotation для установки изображения)
  • получить текущий вид аннотации, вызвав метод экземпляра viewForAnnotation: вида карты (это , а не такой же, как метод делегата mapView:viewForAnnotation:)
  • обновить свойство image представления

См. другой связанный вопрос для аналогичного примера.

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