如何在不使用 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 来设置 latitudelongitude 属性。

我怀疑因为我的keyPathsForValuesAffectingValueForKey: 使coordinate 键同时依赖于latitudelongitude 键,所以当setCoordinate: 使用公共访问器而不是原始访问器时MKMapView 会感到困惑.

当使用公共访问器方法设置纬度和经度时,观察coordinate 键路径的任何对象观察到三个单独的变化(对于键路径coordinatelatitudelongitude)只是应该观察到的一个变化 (coordinate),它混淆了地图视图。

【讨论】:

我还想指出,因为coordinate 不是我的NSManagedObject 中的模型属性,所以我必须为+ (BOOL)contextShouldIgnoreUnmodeledPropertyChanges 返回NO。没有它,NSManagedObjectContext 没有保存更改,因为我使用的是原始访问器。【参考方案2】:

这有点开销,但您可以观察latitudelongitude 参数(分别覆盖它们的设置器),并在更改时强制设置坐标(使用setCoordinate:)。

【讨论】:

我不介意开销,但我的setCoordinate: 方法使用setLatitude:setLongitude:,所以它会产生无限循环。

以上是关于如何在不使用 setCoordinate 的情况下更新注释?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不安装 Zend 框架的情况下使用 Zend 库

如何在不使用 AudioQueueRef 的情况下在 AudioQueue 中设置音量?

如何在不更改链接结构的情况下使用 \ 转义字符 (、)、[、]、*、_、:[]()

如何在不使用滤镜的情况下使图像变暗? [复制]

如何在不使用搜索的情况下查找 youtube 频道当前是不是正在直播?

如何在不安装的情况下使用数据库?