0

我有一个通过 NSArrayController 绑定到 NSMutableArray 的 NSTableView。数组中的内容是派生类;表的前几列绑定到基类中存在的属性。这一切都很好。

我遇到问题的地方是只有当行映射到一个特定的子类时才应该填充的列。该列要显示的属性仅存在于该子类中,因为它对基类没有任何意义。用户将从前两列中知道为什么第三列的单元格被填充/可编辑。

第三列的值的绑定在排列对象上,模型路径类似于“foo.name”,其中 foo 是子类的属性。但是,这不起作用,因为层次结构中的其他子类不符合 foo 的键值。

似乎我唯一的选择是让 foo 成为基类上的一个属性,以便每个人都响应它,但这会使模型对象的接口变得混乱。

有没有人为这种情况想出一个干净的设计?这并不少见(我是 Cocoa 的新手,我只是在学习绑定的来龙去脉。)

4

1 回答 1

1

解决此问题的一种方法是仅对它起作用的前两列使用绑定。对于剩余的列,您实现一个 NSTableViewDataSource 来实现所需的自定义逻辑。

首先创建一个实现的新类

-tableView:objectValueForTableColumn:row:
-tableView:setObjectValue:forTableColumn:row:

(如果用户应该编辑其他列,则只需要第二个)。然后添加一个

IBOutlet NSArrayController *valuesController;

该类的实例变量。

在 Interface Builder 中添加该类的新对象(将蓝色“对象”立方体从库中拖到文件窗口中)。将阵列控制器连接到新数据源。然后将数据源与表视图连接起来,使其成为表视图的数据源。

确保前两列之后的列未绑定任何内容。

-tableView:objectValueForTableColumn:row:

方法将根据需要为这些列调用,您可以根据需要查看对象:

- (id)tableView:(NSTableView *)aTableView
   objectValueForTableColumn:(NSTableColumn *)aTableColumn
                         row:(NSInteger)rowIndex;
{
    NSObject *myObject = [[valuesController arrangedObjects] objectAtIndex:rowIndex];
    id columnIdentifier = [aTableColumn identifier];
    if ([columnIdentifier isEqual:@"foo"]) {
        if ([myObject respondsToSelector:@selector(fooValue)]) {
            return [myObject fooValue];
        }
    }
    return nil;
}

请注意我如何使用列标识符来查看正在请求的列。在 Interface Builder 中设置列​​标识符。

于 2010-06-01T01:18:31.420 回答