NSValueTransform子类是将核心数据属性显示到UI视图中的不错选择:
这里是Core Data为两个属性,计时器和状态显示的内容:
以下是我想要显示的内容,而不更改Core Data中的值:
如果不使用NSValueTransformer,可能还有什么其他方式?
我不希望看到永久转换的数据,只是为了减少Core Data中存储的数据和更好的UI视图项目。
我还尝试修改托管对象类中的属性(没有KVO通知)但没有运气。
答案 0 :(得分:1)
是的,NSValueTransformer
子类可以很好地用于此目的。
您还可以向管理对象类添加只读计算属性,这也应该有效。这些属性甚至可以通过控制器代码中的类别添加,如果它们作为模型代码的一部分没有意义。
例如:
+ (NSSet*) keyPathsForValuesAffectingStatusDisplayName
{
return [NSSet setWithObject:@"status"];
}
- (NSString*) statusDisplayName
{
NSString* status = self.status;
if ([status isEqualToString:@"0"])
return @"Pending";
else if ([status isEqualToString:@"1"])
return @"Completed";
// ...
}
+keyPathsForValuesAffectingStatusDisplayName
方法让KVO和绑定知道status
发生更改时,这个新的statusDisplayName
属性也会发生变化。请参阅+keyPathsForValuesAffectingValueForKey:
的文档,了解其工作原理。
答案 1 :(得分:1)
我最终使用了最初似乎阻止在这些单元格中显示不同信息的内容,使用:
#pragma mark - Table View Delegate
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
/* tableColumn = (string) @"AutomaticTableColumnIdentifier.0"
row = (int) 0 */
NSString *identifier = [tableColumn identifier];
NSTableCellView *cellView = [tableView makeViewWithIdentifier:identifier owner:self];
NSManagedObject *item = [self.itemArrayController.arrangedObjects objectAtIndex:row];
if ([identifier isEqualToString:@"AutomaticTableColumnIdentifier.0"]) {
/* subviews returns array with 0 = Image View &
1 = Text Field */
/* First, set the correct timer image */
... logic ...
NSImageView *theImage = (NSImageView *)[[cellView subviews] objectAtIndex:0];
theImage.image = [NSImage imageNamed:@"green.gif"];
/* Second, display the desired status */
NSTextField *theTextField = (NSTextField *)[[result subviews] objectAtIndex:1];
... logic ...
theTextField.stringValue = @"Pending";
}
return cellView;
}
Apple的文档声明(某处)与数组控制器的绑定可以与手动填充表格视图单元格结合使用。从绑定开始然后手动优化显示值似乎是最好也是最简单的。