如何在不使用 setCoordinate 的情况下更新注释?
Posted
技术标签:
【中文标题】如何在不使用 setCoordinate 的情况下更新注释?【英文标题】:How do I update an annotation without using setCoordinate? 【发布时间】:2012-02-21 17:33:47 【问题描述】:我有一个符合 MKAnnotation 协议的子类 NSManagedObject,它具有纬度和经度的 NSNumber 属性。
当我自己更改任何坐标时,我会使用 setCoordinate: 并在 setCoordinate: 的实现中更新纬度和经度属性。使用此方法,地图视图会更新注释。但是,当我通过 mergeChangesFromContextDidSaveNotification: 将更改与另一个 NSManagedObjectContext 合并时,不使用 setCoordinate: 因为纬度和经度属性已显式更改。这可以防止任何关于坐标变化的 KVO 通知。
我试图让地图视图通过以下代码实现坐标取决于纬度和经度属性:
+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key
NSSet *keyPaths = [super keyPathsForValuesAffectingValueForKey:key];
if ([@"coordinate" isEqualToString:key])
NSSet *affectingKeys = [NSSet setWithObjects:@"latitude", @"longitude", nil];
keyPaths = [keyPaths setByAddingObjectsFromSet:affectingKeys];
return keyPaths;
但是该代码会导致此崩溃:
由于未捕获的异常“NSRangeException”而终止应用,原因:“无法从中删除关键路径“坐标”的观察者,因为它没有注册为观察者。'
关于如何防止崩溃或在纬度或经度发生变化时发送坐标 KVO 通知的替代方法有什么想法吗?感谢您的观看。
【问题讨论】:
【参考方案1】:我通过更改 setCoordinate:
来解决此问题,以便它使用 Core Data 自动生成的 primitive accessors 来设置 latitude
和 longitude
属性。
我怀疑因为我的keyPathsForValuesAffectingValueForKey:
使coordinate
键同时依赖于latitude
和longitude
键,所以当setCoordinate:
使用公共访问器而不是原始访问器时MKMapView
会感到困惑.
当使用公共访问器方法设置纬度和经度时,观察coordinate
键路径的任何对象观察到三个单独的变化(对于键路径coordinate
、latitude
和longitude
)只是应该观察到的一个变化 (coordinate
),它混淆了地图视图。
【讨论】:
我还想指出,因为coordinate
不是我的NSManagedObject
中的模型属性,所以我必须为+ (BOOL)contextShouldIgnoreUnmodeledPropertyChanges
返回NO
。没有它,NSManagedObjectContext
没有保存更改,因为我使用的是原始访问器。【参考方案2】:
这有点开销,但您可以观察latitude
和longitude
参数(分别覆盖它们的设置器),并在更改时强制设置坐标(使用setCoordinate:
)。
【讨论】:
我不介意开销,但我的setCoordinate:
方法使用setLatitude:
和setLongitude:
,所以它会产生无限循环。以上是关于如何在不使用 setCoordinate 的情况下更新注释?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用 AudioQueueRef 的情况下在 AudioQueue 中设置音量?
如何在不更改链接结构的情况下使用 \ 转义字符 (、)、[、]、*、_、:[]()