Cocoa绑定 - NSTableView - 交换值

时间:2015-03-17 00:42:24

标签: objective-c cocoa nstableview cocoa-bindings nsvaluetransformer

NSValueTransform子类是将核心数据属性显示到UI视图中的不错选择:

  1. 将数字字符串(如(0,1,2,3等))转换为字符串,例如(待定,已完成,已冻结,正在进行等)
  2. 基于应用的图像中的数字字符串(0,1)(如果为0则为red.png,如果为1则为green.png)
  3. 这里是Core Data为两个属性,计时器和状态显示的内容:

    enter image description here

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

    enter image description here

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

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

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

2 个答案:

答案 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的文档声明(某处)与数组控制器的绑定可以与手动填充表格视图单元格结合使用。从绑定开始然后手动优化显示值似乎是最好也是最简单的。