【问题标题】:Make CLLocation conform to MKAnnotation使 CLLocation 符合 MKAnnotation
【发布时间】:2014-08-17 15:13:27
【问题描述】:

关于这个问题,我现在对自己失去了信心:

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

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

看到CLLocation已经拥有“只读”属性“坐标”,我认为只需将其重新声明为“读写”即可支持setCoordinateselector。

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

这让我很困惑,因为当我在调用“setCoordinate”的代码中的确切位置中断并按照选择器进行声明时(使用 cmd + ctrl + J),它会将我带到我重新声明的“ readwrite' 属性。

我认为这与其说是 CoreLocation 或 MapKit 的问题,不如说是我没有掌握如何让它发挥作用。

这是我的子类的接口:

@interface MySubclass : CLLocation <MKAnnotation>

@property (nonatomic, readwrite) CLLocationCoordinate2D coordinate;

@end 

我必须@synthesize 属性还是我在这里遗漏了其他东西?

感谢您的帮助

【问题讨论】:

    标签: objective-c mapkit mkannotation cllocation


    【解决方案1】:

    我认为,您认为可以在子类中将属性声明为 readwrite 的假设暴露了对属性的理解不足。

    这个:

    @property (readonly) type propertyName;
    

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

    - (type)propertyName { return 23; }
    

    那么,您究竟希望编译器如何神奇地将其转换为 readwrite

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

    如果您@synthesize,您将同时替换 getter 和 setter。所以原来的getter将不再被调用。

    总结版:

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

    如果您想要一个完全不同的界面,您需要自己编写。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多