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