使CLLocation符合MKAnnotation

时间:2014-08-17 15:13:28

标签: objective-c mapkit mkannotation cllocation

我现在对这个问题已经失去了信心:

我有一个CLLocation子类,它添加了一些属性,并且还采用了<MKAnnotation>协议,所以我可以在mapView中显示它。

注释显示在地图上,一切都按预期工作,直到我尝试使我的“位置注释”可拖动。
要实现可拖动或可动画的注释,我们必须实现setCoordinate:设置器。

看到CLLocation已经拥有'readonly'属性'坐标',我认为将其重新声明为'readwrite'以支持setCoordinate选择器就足够了。

但是,当我尝试在mapView中移动注释时,会出现unrecognized selector send to instance错误。

这对我来说非常困惑,因为当我在调用'setCoordinate'的代码中的确切位置处中断并按照选择器进行它的声明(使用cmd + ctrl + J)时,它使我正确地重新声明了' readwrite'property。

我认为这不是一个CoreLocation或MapKit问题,而只是我没有理解如何让它工作。

这是我的子类的接口:

@interface MySubclass : CLLocation <MKAnnotation>

@property (nonatomic, readwrite) CLLocationCoordinate2D coordinate;

@end 

我是否必须@synthesize该属性或我在这里错过了其他什么?

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

你认为你可以在一个子类中声明一个属性为readwrite的假设表明缺乏对属性的理解,我认为。

此:

@property (readonly) type propertyName;

表示该类实现了一个返回类型为propertyName的方法type。就这样。 它不会告诉您有关实例变量或存储的信息。该班可能有:

- (type)propertyName { return 23; }

那么你究竟期望编译器为你神奇地将其变成readwrite

您正在使用readwrite承诺setPropertyName:也已实施。你没有实现它。那是你的错误。

如果你@synthesize,你将取代吸气剂和二传手。因此,将不再调用原始的getter。

摘要版本:

CLLocation声明readonly属性。这不是你的事,为什么或如何实施这件事。这就是面向对象编程的原因:遵守某个接口的承诺,而不是承诺任何特定的实现。

如果你想要一个根本不同的界面,你需要自己写一下。