1

NSValueTransform 子类是在 UI 视图中显示核心数据属性的好选择吗?

  1. 像 (0,1,2,3,etc) 这样的数字字符串变成像 (Pending, Completed, Frozen, In progress, etc) 这样的字符串
  2. 将 (0,1) 之类的数字字符串转换为基于应用程序的图像(如果为 0,则为 red.png,如果为 1,则为 green.png)

下面是 Core Data 显示的两个属性,timer 和 status:

在此处输入图像描述

这是我想要显示的内容,而不更改 Core Data 中的值:

在此处输入图像描述

如果不使用 NSValueTransformer,还有什么其他可能的方式?

我不想看到数据永久转换,只是为了减少存储在 Core Data 中的数据和更好的 UI 视图项。

我还尝试修改托管对象类中的属性(没有 KVO 通知),但没有成功。

4

2 回答 2

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:以了解其工作原理。

于 2015-03-21T01:19:35.633 回答
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 的文档(某处)指出,与 Array Controller 的绑定可以与手动填充表格视图单元格结合使用。从绑定开始然后手动优化显示值似乎是最好和最简单的。

于 2015-04-01T16:32:27.237 回答