Cocoa 如何在核心数据应用程序中实现只读属性

Cocoa 如何在核心数据应用程序中实现只读属性,cocoa,core-data,Cocoa,Core Data,我正在开发一个核心数据应用程序,它使用一个名为Location的模型对象。用户可以输入位置,并以十进制格式提供其纬度和经度。为此,我使用普通的NSTextFields。作为对用户的反馈,还会显示相应的度数/分/秒(使用标签)。从十进制格式转换为度等的逻辑是通过Location model对象实现的,该对象是NSManagedObject的子类 理想情况下,我希望将这些属性实现为只读属性,并以某种方式将它们与十进制对应项绑定,以便当用户更改十进制表示时,度/分/秒表示也会更新 我尝试了以下方法:

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

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

我尝试了以下方法:

  • 将控制器设置为
    NSTextFieldDelegate
    以拦截编辑,但这仅在用户实际编辑字段时有效。当用户接受0作为纬度和经度的默认值时,此操作将失败,而经度实际上是一个有效位置
  • 我已经查看了核心数据的瞬态属性,但是发现关于这一点的文档不是很有帮助,尽管它们可能是这个问题的答案
关于如何处理这个问题有什么想法吗

编辑:

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

+ (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中添加了绑定到
latitudeToDegrees
longitudtoDegrees
和…boom!。。,一个更新得很好的UI。

如果有人能向我解释瞬态属性,我也很乐意听

由于DMS很容易从纬度和经度计算,因此没有真正的理由将这些值作为属性存储在模型中。我只需要编写一些方法,根据保存的纬度和经度属性计算并返回当前的度、分和秒

然后,要使核心数据自动通知OBerver更改,您需要在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;
}

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