Чтобы контролировать, есть ли в выноске вспомогательная кнопка на основе флажка «clickable» в таблице, я предлагаю вам добавить свойство clickable
в свой класс аннотаций и установить его при добавлении аннотации.Затем вы можете проверить это свойство при создании представления аннотации в методе viewForAnnotation
.
Чтобы добавить аннотации к представлению карты (т. Е. При вызове addAnnotation
), если вы в настоящее время используете пред-определенный класс, такой как MKPointAnnotation
, вместо этого вам нужно будет определить свой собственный класс, который реализует протокол MKAnnotation
.Если у вас уже есть пользовательский класс, добавьте к нему свойство clickable
.
Вот пример пользовательского класса аннотации:
//CustomAnnotation.h...
@interface CustomAnnotation : NSObject<MKAnnotation>
@property (nonatomic, assign) CLLocationCoordinate2D coordinate;
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *subtitle;
@property (nonatomic, assign) int annotationId;
@property (nonatomic, assign) BOOL clickable;
@end
//CustomAnnotation.m...
@implementation CustomAnnotation
@synthesize coordinate;
@synthesize title;
@synthesize subtitle;
@synthesize annotationId;
@synthesize clickable;
- (void)dealloc {
[title release];
[subtitle release];
[super dealloc];
}
@end
Вот пример того, как вы можете создать идобавьте аннотации (фактические значения свойств аннотации будут получены из ваших строк sql):
CustomAnnotation *ca1 = [[CustomAnnotation alloc] init];
ca1.annotationId = 1;
ca1.coordinate = CLLocationCoordinate2DMake(lat1,long1);
ca1.title = @"clickable";
ca1.subtitle = @"clickable subtitle";
ca1.clickable = YES;
[myMapView addAnnotation:ca1];
[ca1 release];
CustomAnnotation *ca2 = [[CustomAnnotation alloc] init];
ca2.annotationId = 2;
ca2.coordinate = CLLocationCoordinate2DMake(lat2,long2);
ca2.title = @"not clickable";
ca2.subtitle = @"not clickable subtitle";
ca2.clickable = NO;
[myMapView addAnnotation:ca2];
[ca2 release];
Тогда viewForAnnotation
будет выглядеть следующим образом:
-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
static NSString *reuseId = @"CustomAnnotation";
MKPinAnnotationView* customPinView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:reuseId];
if (customPinView == nil) {
customPinView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:reuseId] autorelease];
customPinView.pinColor = MKPinAnnotationColorPurple;
customPinView.animatesDrop = YES;
customPinView.canShowCallout = YES;
}
else {
customPinView.annotation = annotation;
}
CustomAnnotation *ca = (CustomAnnotation *)annotation;
if (ca.clickable)
customPinView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
else
customPinView.rightCalloutAccessoryView = nil;
return customPinView;
}
Наконец, выможет обработать нажатие кнопки в методе делегата calloutAccessoryControlTapped
и получить доступ к свойствам вашей пользовательской аннотации:
-(void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{
CustomAnnotation *ca = (CustomAnnotation *)view.annotation;
NSLog(@"annotation tapped, id=%d, title=%@", ca.annotationId, ca.title);
}