异常'NSInvalidArgumentException',原因:' - [AnnotationView setCoordinate:]:发送到实例的无法识别的选择器

时间:2013-10-11 10:13:14

标签: iphone ios mapkit

此错误仅出现在Xcode 版本5.0

在我使用Xcode 版本4.6.2 创建我的应用程序之前,它对我来说非常好用,但是我在Xcode中出现了这个错误 5.0版

我创建了自定义Annotation类来生成我更新的位置和地址。

我的代码是:

AnnotationView.h

#import <MapKit/MapKit.h>

@interface AnnotationView : MKPlacemark

@property (nonatomic, readwrite, assign) CLLocationCoordinate2D coordinate;

@property (nonatomic, strong) NSString *title;
@property (nonatomic, strong) NSString *subtitle;

@end

AnnotationView.m

#import "AnnotationView.h"

@implementation AnnotationView

- (id)initWithCoordinate:(CLLocationCoordinate2D)coordinate addressDictionary:(NSDictionary *)addressDictionary
{
    if ((self = [super initWithCoordinate:coordinate addressDictionary:addressDictionary]))
    {
        self.coordinate = coordinate;
    }
    return self;
}

@end

以上是我的自定义课程。我在MapView中使用它。

CLLocationCoordinate2D theCoordinate ;
    theCoordinate.latitude = [self.latitude doubleValue];
    theCoordinate.longitude = [self.longitude doubleValue];

    AnnotationView *annotation = [[AnnotationView alloc] initWithCoordinate:theCoordinate addressDictionary:nil] ;    
    annotation.title = self.businessName;
    annotation.subtitle = self.businessAddress;
    [self.mapView addAnnotation:annotation];

    MKCoordinateRegion adjustedRegion = [self.mapView regionThatFits:MKCoordinateRegionMakeWithDistance(theCoordinate, 8000, 8000)];
    [self.mapView setRegion:adjustedRegion animated:YES];

请建议我哪里弄错了。

1 个答案:

答案 0 :(得分:4)

AnnotationView的超级类MKPlacemark已存储coordinate - 请注意您将其传递到super initWithCoordinate:方法 - 因此您不需要将coordinate存储在子类中。让超类来处理它。

换句话说,您应该从AnnotationView类中删除此行:

self.coordinate = coordinate;

如果您需要访问coordinate中的AnnotationView媒体资源,请使用[super coordinate]

小心使用同名的自己的属性覆盖超类的属性 - 一般来说,你不想这样做!

至于为什么你之前在Xcode 5中遇到问题的原因:这可能是因为不同版本的编译器对代码的解释略有不同。你的代码总是有问题的,只是编译器现在注意到它的问题。