Это может быть ошибка проектирования вместо синтаксической ошибки, поэтому дайте мне знать, если я кодирую в неправильном направлении.
Я новичок в 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;
}