如何在Core Data应用程序中实现只读属性

时间:2011-10-21 23:52:41

标签: cocoa core-data

我正在开发一个使用名为Location的模型对象的Core Data应用程序。用户可以输入位置并以十进制格式提供其经度和纬度。我使用普通NSTextFields。作为对用户的反馈,还显示他们的度数/分钟/秒对应物(使用标签)。从十进制格式转换为度等的逻辑是使用Location模型对象实现的,该对象是NSManagedObject的子类。

理想情况下,我希望将它们作为只读属性实现,并将它们以某种方式绑定到它们的十进制对应项,这样当用户更改十进制表示时,度/分/秒表示也会更新。

我尝试了以下内容:

  • 将控制器设置为NSTextFieldDelegate以拦截编辑,但这仅在用户实际编辑字段时才有效。当用户接受0作为纬度和经度的默认值时,这会失败,这实际上是一个有效的位置。
  • 我查看了Core Data的瞬态属性,但发现这方面的文档不是很有帮助,尽管它们可能就是答案......

有关如何处理此事的任何想法?

编辑:

根据Francis McGrew的建议,我为Location实现了以下类方法:

+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key {
    NSSet *result = [super keyPathsForValuesAffectingValueForKey:key];

    if ([key isEqualToString:@"latitudeToDegrees"] || [key isEqualToString:@"longitudeToDegrees"]) {
        result = [result setByAddingObjectsFromSet:[NSSet setWithObjects: @"latitude", @"longitude", nil]];
    }
    return result;
}

与他的回答略有不同,因为DMS只是一个由Location计算的格式化字符串表示的属性。然后我在UI中将绑定添加到latitudeToDegreeslongitudeToDegrees以及......繁荣!..,一个很好的更新UI。

1 个答案:

答案 0 :(得分:0)

如果有人可以向我解释瞬态属性,我也很乐意听到它。

由于可以从纬度和经度轻松计算DMS,因此没有理由将这些值存储为模型中的属性。我只会根据保存的纬度和经度属性编写计算并返回当前度,分和秒的方法。

然后,要让Core Data自动通知obervers更改,您可以在Location类中实现以下方法:

+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key {
    NSSet *result = [super keyPathsForValuesAffectingValueForKey:key];

    if ([key isEqualToString:@"degrees"] ||
        [key isEqualToString:@"minutes"] ||
        [key isEqualToString:@"seconds"]) {

        result = [result setByAddingObjectsFromSet:[NSSet setWithObjects:
            @"latitude", @"longitude", nil]];
    }
    return result;

}

这告诉Core Data“瞬态”度,分和秒取决于您的纬度和经度属性。假设您正在使用绑定,您的用户界面应自动更新。要防止用户编辑文本字段,只需在XIB中将其行为设置为“可选”或“无”。 (在XCode 3中,我认为你只需取消选中“可编辑”框)