gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:22:30 26 4
gpt4 key购买 nike

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

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

我尝试过以下方法:

  • 将 Controller 设置为 NSTextFieldDelegate 来拦截编辑,但这仅在用户实际编辑字段时才有效。当用户接受 0 作为纬度和经度的默认值(这实际上是一个有效的位置)时,此操作会失败。
  • 我查看了核心数据的 transient 属性,但发现关于这一点的文档不是很有帮助,尽管它们可能是这个问题的答案......

关于如何解决这个问题有什么想法吗?

编辑:

根据 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 的绑定(bind),以及...boom!...,这是一个经过精心更新的 UI。

最佳答案

如果有人可以向我解释 transient 属性,我也很想听。

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

然后,要让 Core Data 自动通知观察者更改,您需要在 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;

}

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

关于cocoa - 如何在 Core Data 应用程序中实现只读属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7856465/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com