Как узнать, когда вызывается контактный вывод MKPinAnnotationView - PullRequest
0 голосов
/ 27 мая 2010

Я хочу обновить всплывающие субтитры пин-кода (в режиме реального времени), когда получаю новую информацию с сервера, или, по крайней мере, при открытии выноски. Пока что похоже, что pin + callout создаются только один раз в ...

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

... и затем используется как есть до тех пор, пока он существует, независимо от того, сколько раз я касался его, закрывал / открывал или прокручивал, чтобы он оставался видимым. Как мне обновить субтитры?

Ответы [ 2 ]

0 голосов
/ 10 июня 2010

edit :: Существует гораздо лучшее решение, использующее наблюдение значения ключа, которое включает добавление наблюдателя к свойству selected в MKAnnotationView, а затем соответственно обрабатывает его в обратном вызове:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{

Вы можете посмотреть решение здесь: http://blog.evandavey.com/2009/07/how-to-detect-when-mkannotation-mkannotationview-is-selected.html


(старое решение)

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

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

Просто убедитесь, что к каждой аннотации добавлен обратный вызов (он же селектор). Для меня я на самом деле хочу, чтобы на них нажимали UIButton, поэтому я создал их и добавил в качестве rightCalloutAccessoryView для аннотации.

UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
        [rightButton addTarget:self
                        action:@selector(showDetails:)
              forControlEvents:UIControlEventTouchUpInside];
        customPinView.rightCalloutAccessoryView = rightButton;

Затем я создал функцию с именем showDetails в любом делегате, который вы передали в переменную addTarget (в моем случае self, которая является пользовательской UIViewController).

Теперь, когда кто-нибудь нажимает на любую аннотацию, вызывается функция showDetails.

Однако у меня возникают проблемы с определением, какая конкретная аннотация вызывается, поскольку у меня их много на карте, и вызывающая функция showDetails - это не аннотация, а конкретная UIButton.

Я посмотрел на это решение: Чистое решение, чтобы узнать, какое MKAnnotation было использовано? , но оно касается только события внутри viewForAnnotation, которое, как вы упоминали, вызывается только в создание каждой аннотации, а не когда они касаются.

0 голосов
/ 27 мая 2010

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

Попробуйте просто обновить свойство subititle вашего <MKAnnotation> объекта, когда с сервера приходит новый ответ, и MapView должен обновиться сам?

Если нет, попробуйте удалить и повторно добавить аннотацию при изменении информации?

...