我正在开发一个使用名为Location的模型对象的Core Data应用程序。用户可以输入位置并以十进制格式提供其经度和纬度。我使用普通NSTextFields
。作为对用户的反馈,还显示他们的度数/分钟/秒对应物(使用标签)。从十进制格式转换为度等的逻辑是使用Location模型对象实现的,该对象是NSManagedObject
的子类。
理想情况下,我希望将它们作为只读属性实现,并将它们以某种方式绑定到它们的十进制对应项,这样当用户更改十进制表示时,度/分/秒表示也会更新。
我尝试了以下内容:
NSTextFieldDelegate
以拦截编辑,但这仅在用户实际编辑字段时才有效。当用户接受0作为纬度和经度的默认值时,这会失败,这实际上是一个有效的位置。有关如何处理此事的任何想法?
编辑:
根据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中将绑定添加到latitudeToDegrees
和longitudeToDegrees
以及......繁荣!..,一个很好的更新UI。
答案 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中,我认为你只需取消选中“可编辑”框)