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
, которое, как вы упоминали, вызывается только в создание каждой аннотации, а не когда они касаются.