Cocoa touch 实时设置注释坐标

Cocoa touch 实时设置注释坐标,cocoa-touch,mkannotation,Cocoa Touch,Mkannotation,我有一个映射点对象,它符合MKAnnotation协议。在我尝试实时更改它的坐标之前,它一直按预期工作 开始时,我尝试使用: [map_point setCoordinate : new_coordinate]; 它不起作用,因为属性是“只读”的。苹果的文档说我应该添加一个自定义的“setCoordinate”,它需要符合KVO 已经阅读了有关KVO的文档。希望有人能给出一个关于如何使setCoordinate KVO兼容的基本示例 只需使用该精确格式实现一个setCoordinate:方法,

我有一个映射点对象,它符合MKAnnotation协议。在我尝试实时更改它的坐标之前,它一直按预期工作

开始时,我尝试使用:

[map_point setCoordinate : new_coordinate];
它不起作用,因为属性是“只读”的。苹果的文档说我应该添加一个自定义的“setCoordinate”,它需要符合KVO


已经阅读了有关KVO的文档。希望有人能给出一个关于如何使setCoordinate KVO兼容的基本示例

只需使用该精确格式实现一个
setCoordinate:
方法,就会自动符合KVO/KVC。您不需要做任何额外的事情:

- (void)setCoordinate:(CLLocationCoordinate2D)newCoordinate
{
    //In this example, the ivar in this class that holds the coordinate
    //is named "coord".  Simply assign the new value to it...
    coord = newCoordinate;
}
使用与此完全相同的方法(您可以更改参数名称
newCoordinate
),KVO通知将自动为您发出

有关详细信息,请参阅

但是,如果需要以不符合要求的方法更改
坐标
,则可以手动生成KVO通知:

- (void)someNonCompliantMethod
{
    [self willChangeValueForKey:@"coordinate"];
    coord = someNewCoordinate;
    [self didChangeValueForKey:@"coordinate"];
}

请注意,只需将
坐标
属性声明为
assign
readwrite
而不是
readonly
,即可完全避免手动实现
setCoordiante:
方法(和ivar):

@property (nonatomic, assign) CLLocationCoordinate2D coordinate;
//and @synthesize in the @implementation
现在,您不需要编写自定义的getter或setter,并且可以直接从实例化此类的代码分配给
坐标

[map_point setCoordinate : new_coordinate];
或:



最后,如果注释所需的唯一属性是
标题
副标题
,以及
坐标
,您还可以完全避免创建自定义类,而是使用内置的
MKPointAnnotation
类,该类实现了一个可写的
coordinate
属性。

谢谢您的详细回答。这很有帮助。再问一个问题;当你说“someNonCompliantMethod”时,不符合的部分仅仅指它的名称而不是“setCoordinate”吗?通常是的,但我发现有时NSObject仍然能够根据类的编码方式自动处理KVO。如果发现未检测到属性更改,可以自己添加通知。
map_point.coordinate = new_coordinate;