如何在不使用setCoordinate的情况下更新注释?

时间:2012-02-21 17:33:48

标签: cocoa-touch mkmapview mkannotation nsmanagedobjectcontext

我有一个符合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通知的任何想法?谢谢你看看。

2 个答案:

答案 0 :(得分:1)

我通过更改setCoordinate:来修复此问题,以便它使用Core Data自动生成的primitive accessors来设置latitudelongitude属性。

我怀疑是因为我的keyPathsForValuesAffectingValueForKey:使coordinate密钥依赖于latitudelongitude密钥,MKMapView在{setCoordinate:时感到困惑1}}使用公共访问器而不是原始访问器。

当使用公共访问器方法设置纬度和经度时,观察coordinate密钥路径的任何对象都会观察到三个单独的更改(对于密钥路径coordinatelatitudelongitude)当只有一个更改(coordinate)应该被观察时,这会使地图视图混淆。

答案 1 :(得分:0)

它有点开销,但您可以观察latitudelongitude参数(分别覆盖其设置者),并强制设置坐标(使用setCoordinate:)何时改变。