0

我正在尝试在地图视图中标记一个位置。

首先,我MKAnnotation在这样的单独类中实现了协议。

地址注解.h

#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>

@interface AddressAnnotation : NSObject <MKAnnotation>

@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;

- (id)initWithCoordinates:(CLLocationCoordinate2D)location;

@end

地址注释.m

#import "AddressAnnotation.h"

@implementation AddressAnnotation

- (id)initWithCoordinates:(CLLocationCoordinate2D)location
{
    self = [super init];
    if (self)
    {
        self.coordinate = location;
    }

    return self;
}

@end

然后在视图控制器中,我实现了MKMapViewDelegate.

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    if ([annotation isKindOfClass:[MKUserLocation class]])
    {
        return nil;
    }

    static NSString *myIdentifier = @"myIndentifier";
    MKPinAnnotationView *pinView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:myIdentifier];

    if (!pinView)
    {
        pinView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:myIdentifier];
        pinView.pinColor = MKPinAnnotationColorRed;
        pinView.animatesDrop = NO;
    }
    return pinView;
}

viewDidLoad方法中,我初始化了一个AddressAnnotation类的实例。

- (void)viewDidLoad
{
    [super viewDidLoad];

    CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(34.421496, -119.70182);

    AddressAnnotation *pinAnnotation = [[AddressAnnotation alloc] initWithCoordinates:coordinate];
    [self.mapView addAnnotation:pinAnnotation];
}

我不断收到以下错误。

-[AddressAnnotation setCoordinate:]:无法识别的选择器发送到实例

我不确定我在这里做错了什么。有人可以帮我吗?

谢谢你。

4

2 回答 2

1

问题是您定义了一个只读坐标属性。因此,在尝试设置它时会出现异常。只需删除您的坐标属性定义,因为这已由 MKAnnotation 协议提供。

于 2014-01-25T15:38:53.443 回答
0

您的问题是该coordinate属性是只读的。此外,它已经由MKAnnotation协议定义。

当你实现一个定义@properties 的协议时,你实际上必须@syntentize 这些属性来在你的类中创建一个支持实例变量(ivar),或者,你必须为这些属性实现自定义的setter 和getter。

请记住:属性只不过是一个 setter 和 getter 方法,并且可以选择由 ivar 支持。由 ivar 支持是 @property 的默认行为。

因此,简而言之,要解决文件中的问题,请AddressAnnotation.h删除coordinate属性并在AddressAnnotion.m文件中添加:

// after the line @implementation Address Annotation
@syntetize coordinate = _coordinate;
于 2014-01-25T15:36:45.823 回答