Как сохранить данные, связанные с MKAnnotation, от потери после всплывающего вызова и нажатия пользователем кнопки раскрытия?
Как сохранить данные, связанные с объектом 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 ответ
В 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...
}