Перетаскиваемая аннотация с iOS: обновление информации выноски - PullRequest
0 голосов
/ 15 января 2011

У меня проблема с информацией выноски перетаскиваемой аннотации: я использую MKReverseGeocoder, чтобы получить адрес координат, соответствующих положению аннотации.

Но есть кое-что, что мне не удаетсядля контроля: каждый раз, когда перетаскиваемая аннотация удаляется, появляется информация выноски.Очень часто MKReverseGeocoder не успевал обновить информацию об адресе, прежде чем это произойдет.Таким образом, в этих обычных случаях выноска аннотации отображает информацию об адресе, соответствующую предыдущим координатам аннотации.

Вот код:

1) Метод делегата, вызываемый при удалении аннотации:

 - (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)annotationView didChangeDragState:(MKAnnotationViewDragState)newState fromOldState:(MKAnnotationViewDragState)oldState{
        if (oldState == MKAnnotationViewDragStateDragging) {
            MKReverseGeocoder *reverseGeocoder = [[MKReverseGeocoder alloc] initWithCoordinate:annotationView.annotation.coordinate];
            reverseGeocoder.delegate = self;
            [reverseGeocoder start];
            while (reverseGeocoder.querying) {
                [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
            }
            [reverseGeocoder release];
        }   
    }

2) Метод делегата вызывается, когда reverseGeocoder находит ответ:

- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFindPlacemark:(MKPlacemark *)placemark {
    NSString *newSubtitle = [NSString stringWithFormat:@"%@ %@, %@ %@, %@",placemark.subThoroughfare,placemark.thoroughfare,placemark.postalCode,placemark.locality, placemark.country];
    Grocery *draggableGrocery = [myMapView.annotations objectAtIndex:0];
    draggableGrocery.address = newSubtitle;
    self.addressNewGrocery = newSubtitle;
}

Есть идеи?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 30 марта 2011

Другой вариант - установить annotationView.canShowCallout = NO непосредственно перед запуском обратного геокодера, а затем снова установить флаг в YES.

0 голосов
/ 17 января 2011

Я должен был отправить тот же вопрос, я искал ту же проблему со вчерашнего дня.


ОБНОВЛЕНИЕ:


Я только что нашел способ,и я не уверен, что это правильно.Зная, что у меня есть подкласс MKAnnotation с именем selectedAnnotation, я просто отменил выбор, а затем выбрал этот объект после того, как получил новый заголовок в функции revereseGeocoder: didFindPlacemark:

[mapView deselectAnnotation:selectedAnnotation animated:NO];
[mapView selectAnnotation:selectedAnnotation animated:NO];

для вашего случая ваш код должен выглядетькак это:

- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFindPlacemark:(MKPlacemark *)placemark {
    NSString *newSubtitle = [NSString stringWithFormat:@"%@ %@, %@ %@, %@",placemark.subThoroughfare,placemark.thoroughfare,placemark.postalCode,placemark.locality, placemark.country];
    Grocery *draggableGrocery = [myMapView.annotations objectAtIndex:0];
    draggableGrocery.address = newSubtitle;
    self.addressNewGrocery = newSubtitle;
    //  add the following lines [I assumed that draggableGrocery [Grocery class] is a subclass of MKAnnotation]
    [mapView deselectAnnotation:draggableGrocery animated:NO];
    [mapView selectAnnotation:draggableGrocery animated:NO];
}
...