Обновление setCoordinate после добавления аннотации в мой mapView

Я добавляю кучу аннотаций и объединяю их в массив, чтобы я мог вытащить их новые местоположения и соответствующим образом обновить карту БЕЗ предварительного удаления всех аннотаций и добавления их, что вызывает мерцание. К сожалению, после того, как их координаты изначально заданы и добавлены, любой вызов setCoordinate больше не работает. Есть идеи?

- (void)updateMap:(NSData *)responseData {
    //parse out the JSON data
    NSError* error;
    vehicleData = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];

    //find which Dictionary is for our bus.
    for (NSDictionary* route in vehicleData) {
        //find our bus in our vehicles dictionary. Key is by routeID.
        BusPositionDot *busLocationDot; 
        if ([vehicles objectForKey:[route objectForKey:@"RouteID"]] == nil) {
            busLocationDot = [[BusPositionDot alloc] init];
            [vehicles setObject:busLocationDot forKey:[route objectForKey:@"RouteID"]];
            [mapView addAnnotation:[vehicles objectForKey:[route objectForKey:@"RouteID"]]];

        }
        else {
            busLocationDot = [vehicles objectForKey:@"RouteID"];
        }

        float latitude = [[route objectForKey:@"Latitude"] floatValue];
        float longitude = [[route objectForKey:@"Longitude"] floatValue];
        float groundSpeed = [[route objectForKey:@"GroundSpeed"] floatValue];
        float direction = [[route objectForKey:@"Heading"] floatValue];

        float roundedDirection=45 * round(direction/45);

        if(groundSpeed<=3)
            //get view for annotation
            [mapView viewForAnnotation:busLocationDot].image=[UIImage imageNamed:@"buspositiondot.png"];
        else if((roundedDirection==0)||(roundedDirection==360))
            [mapView viewForAnnotation:busLocationDot].image=[UIImage imageNamed:@"buspositiondot0.png"];
        else if(roundedDirection==45)
            [mapView viewForAnnotation:busLocationDot].image=[UIImage imageNamed:@"buspositiondot45.png"];
        else if(roundedDirection==90)
            [mapView viewForAnnotation:busLocationDot].image=[UIImage imageNamed:@"buspositiondot90.png"];
        else if(roundedDirection==135)
            [mapView viewForAnnotation:busLocationDot].image=[UIImage imageNamed:@"buspositiondot135.png"];
        else if(roundedDirection==180)
            [mapView viewForAnnotation:busLocationDot].image=[UIImage imageNamed:@"buspositiondot180.png"];
        else if(roundedDirection==225)
            [mapView viewForAnnotation:busLocationDot].image=[UIImage imageNamed:@"buspositiondot225.png"];
        else if(roundedDirection==270)
            [mapView viewForAnnotation:busLocationDot].image=[UIImage imageNamed:@"buspositiondot270.png"];
        else if(roundedDirection==315)
            [mapView viewForAnnotation:busLocationDot].image=[UIImage imageNamed:@"buspositiondot315.png"];

        CLLocationCoordinate2D currentBusLocation = CLLocationCoordinate2DMake(latitude, longitude);
        NSLog(@"setting coord %f & %f",currentBusLocation.latitude,currentBusLocation.longitude);

        [UIView animateWithDuration:0.5 animations:^{
            [busLocationDot setCoordinate:currentBusLocation];

        }];
    }
}

person jfisk    schedule 03.12.2012    source источник
comment
Когда вы вызываете addAnnotation, вы передаете [vehicles objectForKey:[route objectForKey:@"RouteID"]], но если он уже существует, вы используете [vehicles objectForKey:@"RouteID"]. Почему это? Что именно происходит при вызове setCoordinate (ничего, сбой, другое)?   -  person    schedule 03.12.2012


Ответы (1)


В отношении этой части:

if ([vehicles objectForKey:[route objectForKey:@"RouteID"]] == nil) {
    ...
    [mapView addAnnotation:
        [vehicles objectForKey:[route objectForKey:@"RouteID"]]];
}
else {
    busLocationDot = [vehicles objectForKey:@"RouteID"];
}

когда вы вызываете addAnnotation, вы передаете:

[vehicles objectForKey:[route objectForKey:@"RouteID"]]

но если он уже существует, вы используете:

[vehicles objectForKey:@"RouteID"]

Это означает, что при обновлении аннотации используется другая (скорее всего, неправильная) ссылка.
Либо [vehicles objectForKey:@"RouteID"] на самом деле не является BusPositionDot, либо это не тот экземпляр, который изначально был добавлен с этим "идентификатором маршрута".

Поэтому setCoordinate не будет работать.
Использование той же ссылки при обновлении аннотации должно исправить ситуацию.



Есть несколько других не связанных между собой потенциальных проблем:

  • Код выполняет прямое сравнение с использованием переменной float (например, if(roundedDirection==45)). Это не рекомендуется, даже если это "кажется, что работает" - есть вероятность ошибок точности с плавающей запятой. Либо проверьте, находится ли roundedDirection в очень небольшом диапазоне целевого значения, либо, в вашем случае, просто объявите roundedDirection как int, поскольку похоже, что выражение
    45 * round(direction/45) будет возвращать только значения без дробей.

  • Код устанавливает image представления аннотации напрямую. Это нормально, но убедитесь, что метод делегата viewForAnnnotation также имеет точно такую ​​же логику для установки image на основе направления, иначе может случиться так, что изображение в представлении аннотации будет сброшено до некоторого значения по умолчанию при панорамировании или масштабировании. Вам может понадобиться добавить свойство direction к BusPositionDot.

person Community    schedule 03.12.2012