2011-11-08 95 views
3

我有一些地图视图控制器,我有一个自定义注释。iPhone地图视图自定义注释

自定义注释代码:

#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); 

} 

当我将日志的详细id Xco请说:“在'id'类型的对象上找不到'属性'detailID'”有什么问题?

+0

@Alexander Farber感谢您为提高问题质量所做的努力。但请注意,在这里,许多人都认为去除称呼或“感谢”是次要的改变。尝试进行编辑_substantial_。 –

回答

3

它不知道的注释是你的自定义注解:

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

你可以施放像这样沉默警告

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

后在检查,这是一个DisplayMapAnnotation *

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

我可以有一些不同的问题吗?有时我会有少量的注释。这是行之有效的,但有时我有很多注释,然后我收到内存警告,我的应用程序崩溃。有一些解决方案如何解决它?坦克...... – mysho

+0

您应该提出一个新问题,并提供有关注释数量,如何实施dealloc方法以及在获取mem警告时执行的操作的详细信息。 – jbat100