Подтвердить что ты не робот

Сила MKMapView viewForAnnotation для обновления

Итак, у меня есть MKMapView с добавленными моими контактами, а цвет булавки зависит от того, установлено ли значение для этого вывода. Когда я впервые загружаю приложение, вызывается viewForAnnotation и соответственно устанавливаются цвета. Однако, когда я обновляю информацию о контактах (например, местоположение, название и т.д.), Я также обновляю pinColour, чтобы найти, что он не обновляется. Похоже, что viewForAnnotation не вызывается снова после первоначального добавления.

Я прочитал много вопросов, подобных этому, и я могу подтвердить, что mapView.delegate = self;

Вот мой код viewForAnnotation:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(MapAnnotation *)annotation
{
    if([annotation class] == MKUserLocation.class)
        return nil;

    NSString *pinIdentifier = annotation.identifier; // This is a unique string for each pin and is getting populated every time!

    MKPinAnnotationView *annotationView = (MKPinAnnotationView *) [mapView dequeueReusableAnnotationViewWithIdentifier:pinIdentifier];

    if(annotationView == nil)
        annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:pinIdentifier];
    else
        annotationView.annotation = annotation; // Never had this line fire...

    annotationView.canShowCallout = YES;
    annotationView.animatesDrop = NO;
    annotationView.enabled = YES;
    annotationView.tag = annotation.counter;

    if(annotation.pinColour == Stopped) // from enum
        annotationView.pinColor = MKPinAnnotationColorRed;
    else
        annotationView.pinColor = MKPinAnnotationColorGreen;

    UIButton *infoButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
    [infoButton addTarget:self action:@selector(mapCalloutButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
    infoButton.tag = annotation.counter;
    annotationView.rightCalloutAccessoryView = infoButton;

    return annotationView;
}

Вот код, где я добавляю вывод:

CLLocationCoordinate2D annotationCoord;
annotationCoord.latitude = latestPosition.latitude;
annotationCoord.longitude = latestPosition.longitude;

MapAnnotation *annotation = [[MapAnnotation alloc] init];
annotation.coordinate = annotationCoord;
annotation.identifier = theIdentifier;
annotation.title = theTitle;
annotation.subtitle = theSubtitle
annotation.pinColour = [self getPinColour];
annotation.counter = theCounter;

[theMapView addAnnotation:annotation];

Вот код, где я обновляю вывод (другой метод для добавления):

updatePin = true;
pinCounter = mapPin.counter;

CLLocationCoordinate2D annotationCoord;
annotationCoord.latitude = latestPosition.latitude;
annotationCoord.longitude = latestPosition.longitude;
[mapPin setCoordinate:annotationCoord];

mapPin.identifier = theIdentifier;
mapPin.subtitle = theSubtitle;
mapPin.pinColour = [self getPinColour];

Я не уверен, что мне не хватает. viewForAnnotation, очевидно, работает, он просто не вызван после первоначального добавления! Если бы это вызвало эту функцию, я на 100% уверен, что она будет работать, так как она меняет цвет, если я перезапущу приложение!

EDIT: О, и я действительно не хочу начинать удаление аннотаций и их повторное добавление. Это то, что я делаю в краткосрочной перспективе!

4b9b3361

Ответ 1

Из-за того, как в представлении карты скрываются аннотации, вам нужно удалить и повторно добавить аннотацию, если вам нужно внести изменения в ее внешний вид. Простое удаление и добавление - это путь. Механизм недействительности кэша отсутствует, но это.

Ответ 2

Собственно, я не знаю, работает ли это для вас, но так я и сделал.

Мне не нужно было удалять аннотацию с карты. Все, что мне нужно сделать, это показать карте, чтобы дать мне аннотацию для аннотации параметров. Карта вернет правильную аннотацию. Оттуда у меня есть свойство для моей пользовательской аннотации, чтобы определить, является ли это активным элементом, если да, показать нормальное изображение пин-кода, а также показать полное пин-образ.

-(void)updateAnnotationImage:(CustomAnnotation *)paramAnnotation
{
    MKAnnotationView *av = [geoMap viewForAnnotation:paramAnnotation];

    if (paramAnnotation.active)
    {
        av.image = [UIImage imageNamed:@"PinNormal.png"];
    }
    else
    {
        av.image = [UIImage imageNamed:@"PinFull.png"];
    }
}

Немного поздно, но, надеюсь, это поможет другим, кто столкнулся с этой проблемой.

Ответ 4

Swift 2.1:

У меня была такая же проблема, и я нашел быстрое решение, запускаю это при необходимости, а также отправку его в основной поток будет разумным:

var annotationsArray = mapView.annotations
mapView.removeAnnotations(mapView.annotations)
mapView.addAnnotations(arrayIncs)
arrayIncs.removeAll()