2011-11-08 39 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]; 

} 

Aここでは、私が注釈を作成する私のマップビューコードです: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をログに記録するときde say: "プロパティ 'detailID'が 'id'型のオブジェクトに見つかりませんでした。"何が間違っていますか?

+0

@Alexander Farber質問の質を向上させるよう努力していただきありがとうございます。しかし、挨拶や「ありがとう」を削除することは、ここでは多くの人があまりにも小さな変更とみなすことに注意してください。 _substantial_を編集してみてください。 –

答えて

3

それは注釈は、カスタムアノテーションであることを知りません。

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

あなたはそれが* DisplayMapAnnotationであることを確認した後に警告

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

を沈黙させるこのようにそれを唱えられる

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

別の質問がありますか?時々私は少量の注釈を持っています。これはうまくいっていますが、アノテーションがたくさんあることがありますが、メモリ警告が表示され、アプリがクラッシュしています。それを修正する方法はいくつかありますか?タンク... – mysho

+0

新しい質問をして、注釈の数、deallocメソッドを実装する方法、mem警告を受け取ったときに何を行うのかについて詳しく説明する必要があります。 – jbat100