尝试调用注释时出现NSInvalidArgumentException

时间:2012-03-15 23:35:13

标签: objective-c ios mkannotation

注释在地图上显示正常,但是当我点击一个时,我会发现这个例外:

[NSNull length]: unrecognized selector sent to instance
'NSInvalidArgumentException', reason: '-[NSNull length]: unrecognized selector sent to instance 

我的相关代码是:

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

    static NSString *identifier = @"MyLocation";   
    if ([annotation isKindOfClass:[MyLocation class]]) {

        MKPinAnnotationView *annotationView = (MKPinAnnotationView *) [mapView2 dequeueReusableAnnotationViewWithIdentifier:identifier];
        if (annotationView == nil) {
            annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
        } else {
            annotationView.annotation = annotation;
        }

        annotationView.enabled = YES;
        annotationView.canShowCallout = YES;

        annotationView.pinColor = MKPinAnnotationColorRed;
        return annotationView;
    }

    return nil;    
}

并配置注释:

NSNumber * latitude = [[row objectAtIndex:21]objectAtIndex:1];
        NSNumber * longitude = [[row objectAtIndex:21]objectAtIndex:2];
        NSString * crimeDescription = [row objectAtIndex:17];
        NSString * address = [row objectAtIndex:13];

        CLLocationCoordinate2D coordinate;
        coordinate.latitude = latitude.doubleValue;
        coordinate.longitude = longitude.doubleValue;            
        MyLocation *annotation = [[MyLocation alloc] initWithName:crimeDescription address:address coordinate:coordinate] ;
        [mapView2 addAnnotation:annotation];

在包含注释的MyLocation类中:

- (id)initWithName:(NSString*)name address:(NSString*)address coordinate:(CLLocationCoordinate2D)coordinate {
    if ((self = [super init])) {
        _name = [name copy];
        _address = [address copy];
        _coordinate = coordinate;
    }
    return self;
}

1 个答案:

答案 0 :(得分:6)

当您点按注释视图时,它会尝试获取注释length的{​​{1}},以便它知道标注的宽度。

您获得的异常表示该注释的title以某种方式设置为title对象而不是NSNull

NSString对象没有NSNull方法,因此您会收到“无法识别的选择器”异常。


您尚未显示length类中title的实现方式,但我认为它会将MyLocation设置为_name(来自crimeDescription }数组)创建注释时。

不知何故,row数组中的值为row而不是NSNull

如果您不需要NSString值,则可以更改设置NSNull数组值的代码,以便它不会放置row s(它可以放置NSNull 1}}类似于NSString

另一个选项是,您可以修改@"Unknown"类中title的getter方法,如果MyLocation是{{{},则返回“未知”NSString 1}}。

例如:

_name