Получить URI из MKAnnotation, выбранного в MKmapview - PullRequest
1 голос
/ 18 ноября 2011

Это может быть ошибка проектирования вместо синтаксической ошибки, поэтому дайте мне знать, если я кодирую в неправильном направлении.

Я новичок в Cocoa Touch / Objective-C и работаю над учебными пособиями по основным данным и MapKit. До сих пор приложение размещает аннотацию в виде карты для элементов, извлеченных из Core Data. Я создал пользовательский объект аннотации (называемый MapPin), который также содержит URI (NSURL *), указывающий на объект в Core Data, который он представляет. Когда пользователь выбирает аннотацию, я хочу использовать свойство URI этой аннотации, чтобы найти, какой объект в coredata представляет аннотация.

Это работает, если я заранее добавляю аннотацию к просмотру карты. Здесь я добавляю аннотацию MapPin для каждого объекта "вещь"

//viewWillAppear function in my ViewController
NSURL *uri = [[thing objectID] URIRepresentation];
MapPin *annotation = [[[MapPin alloc] initWithName:thing.common description:thing.latin coordinate:coordinate uri:uri] autorelease];
NSLog(@"MapPin URI: %@", [annotation.uri absoluteString]);     //This works!
[_mapView addAnnotation:annotation];
NSLog(@"Placed Map Pin: %@", thing.common);

Позже, когда пользователь выбирает аннотацию и нажимает кнопку в выноске annotationView, я хочу получить доступ к URI для выбранной аннотации

//the UIButton click action in my view controller    
MSPTreesAppDelegate *del = (MSPTreesAppDelegate *)[UIApplication sharedApplication].delegate;
NSArray *annArray = _mapView.selectedAnnotations;
MapPin *selectedPin = [annArray objectAtIndex:0];

NSLog(@"Selected Pin Name: %@", selectedPin.name);             //Works fine
NSLog(@"URI PASSED: %@", [selectedPin.uri absoluteString]);    //Doesn't work
NSURL* uriForTree = selectedPin.uri;                           //also doesn't work

Я замечаю в отладчике, что перед добавлением аннотации к представлению карты свойство URI показывает правильную строку. После того, как аннотация (MapPin) выбрана в представлении карты, свойство URI в отладчике просто отображает «недопустимое резюме».

Когда я пытаюсь получить доступ к свойству URI, программа заканчивается, и я получаю «Поток 1: Программа получила сигнал:« EXC_BAD_ACCESS »». ошибка. Журнал не показывает ничего полезного, кроме этого.

Я предполагаю, что мое пользовательское свойство URI для моего объекта MKAnnotation не поддерживается MKAnnotationView или MKMapView, но я не могу понять, где теряется URI. Есть ли способ получить мое свойство URI из выбранной аннотации? Приветствуются другие предложения по методам реализации той же концепции.

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {
static NSString *identifier = @"MapPin";
if ([annotation isKindOfClass:[MapPin class]]) {
    NSLog(@"Annotation is a MapPin");

    TreeAnnotationView *annotationView = (TreeAnnotationView *) [_mapView dequeueReusableAnnotationViewWithIdentifier:identifier];
    if (annotationView == nil) {
        annotationView = [[TreeAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
    } else {
        annotationView.annotation = annotation;
    }

    annotationView.enabled = YES;
    annotationView.canShowCallout = YES;
    //Place details button in callout
    UIButton * detailButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
    [detailButton setTitle:annotation.title forState:UIControlStateNormal];
    [detailButton addTarget:self action:@selector(showDetails:) forControlEvents:UIControlEventTouchUpInside];
    annotationView.rightCalloutAccessoryView = detailButton;
    return annotationView;
}
return nil;
}

1 Ответ

1 голос
/ 24 ноября 2011

Почему бы не сделать ваш MapPin подклассом NSManagedObject и заставить его реализовывать MKAnnotation?

@interface MapPin : NSManagedObject <MKAnnotation>
@end

Таким образом, один и только один объект модели для представления контакта, и этот объект модели сохраняется через CoreData.

Но ваши "EXC_BAD_ACCESS" и "неверная сводка" указывают на то, что URI не сохраняется (сильный, если вы используете ARC).

...