Как сохранить данные, связанные с MKAnnotation, от потери после всплывающего вызова и нажатия пользователем кнопки раскрытия? - PullRequest
2 голосов
/ 21 марта 2012

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

У меня есть простой класс MKAnnotation, который выглядит следующим образом:

#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>
@interface VoiceMemoryAnnotation : NSObject <MKAnnotation> {
    NSString * blobkey;
}
@property (nonatomic, retain) NSString * blobkey;

-(id)initWithBlobkey:(NSString *) key andCoordinate:(CLLocationCoordinate2D) c;
@end

Я реализовал обратный вызов "viewForAnnotation"

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id     <MKAnnotation>)annotation
{
    MKPinAnnotationView*singleAnnotationView = [[MKPinAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:nil];


// PM: this pin will have a callout (i.e. dont' forget to override title function! Else exception thrown)
    singleAnnotationView.canShowCallout = YES;

// PM: add disclosure button
    UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];

// PM: when user taps disclosure button, bring them to another page with details about the selected voice memory
       [rightButton addTarget:self action:@selector(showPinDetails:) forControlEvents:UIControlEventTouchUpInside];
    singleAnnotationView.rightCalloutAccessoryView = rightButton;

    return singleAnnotationView;
}

Если я правильно понимаю, приведенный выше методвызывается, когда вы добавляете VoiceMemoryAnnotation к объекту карты.Когда вызывается этот viewForAnnotation, я просто выделяю объект MKPinAnnotationView и возвращаю его.Когда пользователь нажимает на этот перенастроенный штифт, он видит выноску.Как только они нажимают кнопку раскрытия, она вызывает «showPinDetails»:

- (void)showPinDetails:(id)sender
{


    detailViewController = [[MemoryDetailViewController alloc]initWithNibName:@"MemoryDetailViewController" bundle:nil];
    [self presentModalViewController:detailViewController animated:YES];

}

Проблема в том, что объект «отправитель» не содержит никакой информации о том, какой контакт был выбран.Есть ли способ передать выбранную аннотацию методу showPinDetails?

1 Ответ

8 голосов
/ 21 марта 2012

В методе showPinDetails: текущую выбранную аннотацию можно получить из свойства selectedAnnotations представления карты.

Это свойство имеет значение NSArray, но поскольку представление карты позволяет выбирать только одну аннотацию за раз, вы просто используете объект с индексом 0. Например:

- (void)showPinDetails:(id)sender
{
    if (mapView.selectedAnnotations.count == 0)
    {
        //no annotation is currently selected
        return;
    }

    id<MKAnnotation> selectedAnn = [mapView.selectedAnnotations objectAtIndex:0];

    if ([selectedAnn isKindOfClass[VoiceMemoryAnnotation class]])
    {
        VoiceMemoryAnnotation *vma = (VoiceMemoryAnnotation *)selectedAnn;
        NSLog(@"selected VMA = %@, blobkey=%@", vma, vma.blobkey);
    }
    else
    {
        NSLog(@"selected annotation (not a VMA) = %@", selectedAnn);
    }

    detailViewController = [[MemoryDetailViewController alloc]initWithNibName:@"MemoryDetailViewController" bundle:nil];
    [self presentModalViewController:detailViewController animated:YES];
}


Вместо использования пользовательского метода действия кнопки может быть проще использовать метод делегата calloutAccessoryControlTapped представления карты, который позволяет более непосредственно получить доступ к выбранной аннотации. В viewForAnnotation удалите addTarget и просто реализуйте метод делегата:

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view 
    calloutAccessoryControlTapped:(UIControl *)control
{
    id<MKAnnotation> selectedAnn = view.annotation;

    if ([selectedAnn isKindOfClass[VoiceMemoryAnnotation class]])
    {
        VoiceMemoryAnnotation *vma = (VoiceMemoryAnnotation *)selectedAnn;
        NSLog(@"selected VMA = %@, blobkey=%@", vma, vma.blobkey);
    }
    else
    {
        NSLog(@"selected annotation (not a VMA) = %@", selectedAnn);
    }

    //do something with the selected annotation... 
}
...