Основываясь на опубликованном коде, я понимаю следующее:
marker
- это класс верхнего уровня, в котором хранятся все сведения о местоположении, включая address
и city
.
AddressAnnotation
- это класс, который реализует протокол MKAnnotation
, в настоящее время содержащий только координаты, заголовок и субтитры для местоположения (он не имеет address
и city
).Это класс, используемый для создания объектов, которые передаются в метод addAnnotation
представления карты.
Что вы хотели бы сделать, это то, что, когда кнопка аннотации нажата на аннотации, вы хотели бы показать некоторыеподробный вид или информация, требующая address
и city
.
Вместо того, чтобы пытаться отслеживать индексы массива с помощью тегов или искать объекты в массивах, я предлагаю добавить ссылку на marker
вAddressAnnotation
.Таким образом, если у вас есть объект AddressAnnotation
, вы можете получить связанный с ним объект marker
, используя эту ссылку (не требуется поиск или индексы).
В классе AddressAnnotation
добавьте свойство retain:тип marker
называется parentMarker
.При создании объекта AddressAnnotation
из marker
и перед вызовом addAnnotation
установите для свойства parentMarker
текущее значение marker
.
Затем в calloutAccessoryControlTapped
приведите view.annotation
кAddressAnnotation
для быстрого доступа к свойству parentMarker
.Теперь вы можете получить address
и city
от маркера.(Кстати, в этом методе вам не нужно приводить view
к MKAnnotationView
, поскольку он уже равен единице, и вам не нужно называть его annView
.)
Я не являюсьуверен, что такое BcardView
и почему вы проверяете, скрыт он или нет.
Я бы также предложил немного улучшить метод viewForAnnotation
(используйте непустой идентификатор повторного использования и переместитеустановка свойств, которые не изменяются внутри if
):
- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>) annotation
{
MKAnnotationView *annView = (MKAnnotationView *)[mapView
dequeueReusableAnnotationViewWithIdentifier:@"AddrAnnot"];
if (annView == nil)
{
annView = [[[MKAnnotationView alloc] initWithAnnotation:annotation
reuseIdentifier:@"AddrAnnot"] autorelease];
annView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
annView.image = [UIImage imageNamed:@"flag.png"];
[annView setEnabled:YES];
[annView setCanShowCallout:YES];
}
annView.annotation = annotation;
return annView;
}