iPhone карта вид пользовательской аннотации - PullRequest
3 голосов
/ 08 ноября 2011

У меня есть контроллер отображения карты, и у меня есть пользовательская аннотация.

Код пользовательской аннотации:

#import <Foundation/Foundation.h>
#import <MapKit/MKAnnotation.h>

@interface DisplayMapAnnotation : NSObject <MKAnnotation> {

    CLLocationCoordinate2D coordinate; 
    NSString *title; 
    NSString *subtitle;
    NSString *detailID;

}

@property (nonatomic, assign) CLLocationCoordinate2D coordinate; 
@property (nonatomic, retain) NSString *title;
@property (nonatomic, retain) NSString *subtitle;
@property (nonatomic, retain) NSString *detailID;

@end

#import "DisplayMapAnnotation.h"

@implementation DisplayMapAnnotation
@synthesize coordinate, title, subtitle, detailID;

- (NSString *) title
{

    return title;

}

- (NSString *) subtitle
{

    return subtitle;

}

- (NSString *) detailID
{

    return detailID;

}

- (id)initWithCoordinate:(CLLocationCoordinate2D) c 
{

    coordinate=c;
    return self;

}

- (void) dealloc
{

    [title release];
    [subtitle release];
    [detailID release];

    [super dealloc];

}

А вот мой код вида карты, где я создаю аннотацию: В методе viewDidLoad я делаю что-то вроде этого:

for (FeedItems *aItem in geoDataList) {

            [mapView setZoomEnabled:YES];
            [mapView setScrollEnabled:YES];
            MKCoordinateRegion region = { {0.0, 0.0 }, { 0.0, 0.0 } }; 
            region.center.latitude = [aItem.geoLat doubleValue];
            region.center.longitude = [aItem.geoLng doubleValue];
            region.span.longitudeDelta = kLatitudeDelta;
            region.span.latitudeDelta = kLongitudeDelta;
            [mapView setRegion:region animated:YES]; 



            ann = [[DisplayMapAnnotation alloc] init]; 
            ann.title = aItem.job;
            ann.subtitle = aItem.jobCompany; 
            ann.detailID = aItem.jobID;
            ann.coordinate = region.center; 
            [mapView addAnnotation:ann];

            [aItem release];
        }

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation
{

    MKPinAnnotationView *pinView = nil; 

    if (annotation != self.mapView.userLocation) {

        static NSString *defaultPinID = @"com.invasivecode.pin";

        pinView = (MKPinAnnotationView *)[self.mapView dequeueReusableAnnotationViewWithIdentifier:defaultPinID];

        if (pinView == nil) 
            pinView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:defaultPinID] autorelease];

        pinView.pinColor = MKPinAnnotationColorRed; 
        pinView.canShowCallout = YES;
        pinView.animatesDrop = YES;

        if (mapIdentifier == 0) {

            UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
            //NSInteger annotationValue = [annView indexOfObject:annotation];
            //rightButton.tag = annotationValue;
            [rightButton addTarget:self action:@selector(detailButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
            pinView.rightCalloutAccessoryView = rightButton;

        }

    } else {

        [self.mapView.userLocation setTitle:@"your location"];

    }

    return pinView;

}

И вот моя проблема (этот метод):

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

    NSLog(@"Detail id: %@", view.annotation.detailID);

}

Когда я регистрирую подробный идентификатор, Xcode говорит: «Свойство detailID не найдено для объекта типа« id ». Что не так?

1 Ответ

3 голосов
/ 08 ноября 2011

Он не знает, что аннотация является вашей пользовательской аннотацией:

NSLog(@"Detail id: %@", view.annotation.detailID);

Вы можете разыграть ее так, чтобы отключить предупреждение

NSLog(@"Detail id: %@", [(DisplayMapAnnotation*)view.annotation detailID]);

после проверки, что этоDisplayMapAnnotation *

if ([view.annotation isKindOfClass:[DisplayMapAnnotation class]])
...