我有一个子类NSManagedObject,它符合MKAnnotation协议,它具有纬度和经度的NSNumber属性。
当我自己更改任何坐标时,我使用setCoordinate:并更新setCoordinate:实现中的纬度和经度属性。使用此方法,map视图将更新注释。但是,当我通过mergeChangesFromContextDidSaveNotification:将更改与另一个mergeChangesFromContextDidSaveNotification合并时,由于纬度和经度属性显式更改,因此不使用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通知的替代方法,有什么想法吗?谢谢你看一看。
发布于 2012-02-22 22:06:19
我通过更改setCoordinate:来修正这个问题,以便它使用由原语存取器数据自动生成的原语存取器来设置latitude和longitude属性。
我怀疑,由于我的keyPathsForValuesAffectingValueForKey:使coordinate键同时依赖于latitude和longitude键,所以当setCoordinate:使用公共访问器而不是原始访问器时,MKMapView会感到困惑。
当使用公共访问器方法设置纬度和经度时,任何观察coordinate密钥路径的对象都会观察到三个单独的变化(对于密钥路径coordinate、latitude和longitude),而此时只需要观察一个更改(coordinate),这就混淆了地图视图。
发布于 2012-02-21 18:12:18
这有点开销,但您可以观察到latitude和longitude参数(resp )。重写它们的设置程序),并在更改时强制设置坐标(使用setCoordinate:)。
https://stackoverflow.com/questions/9382266
复制相似问题