我现在对这个问题已经失去了信心:
我有一个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该属性或我在这里错过了其他什么?
感谢您的帮助
答案 0 :(得分:0)
你认为你可以在一个子类中声明一个属性为readwrite
的假设表明缺乏对属性的理解,我认为。
此:
@property (readonly) type propertyName;
表示该类实现了一个返回类型为propertyName
的方法type
。就这样。 它不会告诉您有关实例变量或存储的信息。该班可能有:
- (type)propertyName { return 23; }
那么你究竟期望编译器为你神奇地将其变成readwrite
?
您正在使用readwrite
承诺setPropertyName:
也已实施。你没有实现它。那是你的错误。
如果你@synthesize
,你将取代吸气剂和二传手。因此,将不再调用原始的getter。
摘要版本:
CLLocation
声明readonly
属性。这不是你的事,为什么或如何实施这件事。这就是面向对象编程的原因:遵守某个接口的承诺,而不是承诺任何特定的实现。
如果你想要一个根本不同的界面,你需要自己写一下。