Условный пользовательский вид аннотации в iphone MapView - PullRequest
0 голосов
/ 05 ноября 2011

В моем MapView я читаю данные из SQLite и отображаю на нем выводы (до 5000 записей).

база данных имеет структуру ID |Долгота |Широта |Название |подзаголовок

я использовал этот код, чтобы сделать клик кликабельным:

pin.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];

мне нужно добавить новый столбец (кликабельный) в базе данных и сделать клик кликабельным, только если «кликабельный»"значение включено.

есть подробное предложение о том, как лучше всего это сделать?

Ответы [ 2 ]

2 голосов
/ 05 ноября 2011

По моему опыту, если вы не установили какое-либо свойство аннотации (заголовок, подзаголовок, изображение, вспомогательная кнопка) и коснулись булавки, выноска не отображается. Вместо этого, если вы хотите показать выноску, но не вызывать действие, когда нажимается дополнительная кнопка, вы можете использовать такую ​​вещь:

(После загрузки данных из БД вы можете сохранить каждый элемент как NSDictionary, а затем все элементы в NSArray)

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control{

    NSString *clickable=[[yourArray objectAtIndex:yourIndex] objectForKey:@"clickable"];
    if(![clickable isEqualToString:@"YES"]){
        return;
    }
}

Конечно, я использовал строку в качестве примера, вы также можете использовать NSNumber с или BOOL с.

Надеюсь, я понял ваш вопрос.

0 голосов
/ 06 ноября 2011

Чтобы контролировать, есть ли в выноске вспомогательная кнопка на основе флажка «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);
}
...