无法识别的选择发送到实例[CustomAnnotation的setTitle]

问题描述:

我想设置自定义注解标题的价值,但我得到了崩溃report.crash报告:无法识别的选择发送到实例[CustomAnnotation的setTitle]

“终止应用程序由于未捕获的异常 ‘NSInvalidArgumentException’的,原因是:“ - [CustomAnnotation的setTitle:]: 无法识别的选择发送到实例”

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated 
{ 
    MKMapRect mapRect = mapView.visibleMapRect; 
    MKMapPoint eastMapPoint = MKMapPointMake(MKMapRectGetMinX(mapRect), MKMapRectGetMidY(mapRect)); 
    MKMapPoint westMapPoint = MKMapPointMake(MKMapRectGetMaxX(mapRect), MKMapRectGetMidY(mapRect)); 

    CGFloat meters = MKMetersBetweenMapPoints(eastMapPoint, westMapPoint); 

    if (meters > 15000) 
     return; 

    // if we have some backlogged requests, let's just get rid of them 

    [self.searchQueue cancelAllOperations]; 

    // issue new MKLoadSearch 

    [self.searchQueue addOperationWithBlock:^{ 

     __block BOOL done = NO; 

     MKLocalSearchRequest *request = [[MKLocalSearchRequest alloc] init]; 
     request.naturalLanguageQuery = @"theater"; 
     request.region = mapView.region; 

     MKLocalSearch *localSearch = [[MKLocalSearch alloc] initWithRequest:request]; 
     [localSearch startWithCompletionHandler:^(MKLocalSearchResponse *response, NSError *error) { 

      NSMutableArray *annotations = [NSMutableArray array]; 



      [response.mapItems enumerateObjectsUsingBlock:^(MKMapItem *item, NSUInteger idx, BOOL *stop) { 

       for (CustomAnnotation *annotation in mapView.annotations) 
       { 
        // if we don't need this one, don't add it, just return, and we'll check the next one 

        annotation.title; 

        NSLog(@"%@",annotation.title); 

        if ([annotation isKindOfClass:[CustomAnnotation class]]) 
         if (item.placemark.coordinate.latitude == annotation.coordinate.latitude && 
          item.placemark.coordinate.longitude == annotation.coordinate.longitude) 
         { 
          return; 
         } 
       } 


       NSLog(@"%f",item.placemark.coordinate.latitude); 

       NSLog(@"%f",item.placemark.coordinate.longitude); 
       // otherwise add it 


       CustomAnnotation *annotation = [[CustomAnnotation alloc] initWithPlacemark:item.placemark]; 

       CLLocation *locA = [[CLLocation alloc] initWithLatitude:37.33554 longitude:-121.885209]; 

       CLLocation *locB = [[CLLocation alloc] initWithLatitude:item.placemark.coordinate.latitude longitude:item.placemark.coordinate.longitude]; 

       CLLocationDistance distance = [locA distanceFromLocation:locB]; 
       NSLog(@"%f",distance); 

       annotation.title=item.title;  --> i get crash report in this line 
       NSLog(@"%@",annotation.title); 
       annotation.phone = item.phoneNumber; 
       annotation.subtitlee = item.placemark.addressDictionary[(NSString *)kABPersonAddressStreetKey]; 
       [annotations addObject:annotation]; 

       NSLog(@"%@",annotations); 

       //[self.mapView addAnnotations:annotation.name]; 
      }]; 




      [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 
       //CustomAnnotation 

       [self.mapView addAnnotations:annotations]; 
      }]; 

      done = YES; 
     }]; 

     while (!done) 
      [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode 
            beforeDate:[NSDate distantFuture]]; 
    }]; 


} 

//////////////////////// ///////////

谢谢...

enter code here 



#import <MapKit/MapKit.h> 

@interface CustomAnnotation : MKPlacemark 
{ 
    CLLocationCoordinate2D coordinate; 
} 

@property (strong, nonatomic) NSString *title; 
@property (strong, nonatomic) NSString *subtitlee; 
@property (strong, nonatomic) NSString *phone; 
@property (nonatomic) NSUInteger index; 
enter code here 

@end

+1

请在你启动'annotation'的地方使用代码。 – anhtu

+0

做了您的注释类有一个名为标题的属性? – ronan

+0

你能提供更多的细节吗?请粘贴代码的重要部分,以便任何人都可以重现您的错误。 – Mariano

是从MKAnnotation您CustomAnnotation类继承? 定义的MKAnnotation

@property(nonatomic, readonly, copy) NSString *title
+0

它不起作用。 – Barani

我想通了。 CustomAnnotationMKPlacemark的一个子类,它符合MKAnnotation协议。 MKAnnotation协议已获得财产title

所以你实际上是从MKAnnotation协议继承这个属性,但这不是你想要的。只需将您的title属性重命名为customAnnotationTitle,你应该没问题。