基于视图的NSTableView的目标操作数据源更新

时间:2011-10-27 11:20:27

标签: objective-c cocoa nstableview

我有使用基于视图的表视图并且不想在数据源和表视图之间使用绑定的情况。这主要是因为我的NSTableCellView可以有多个子视图,复杂的验证和对其他对象中方法的触发调用。

我们有非常明确的使用数据源更新NSTableView的路径:

tableView:viewForTableColumn:row:

但是,对于向后,即使用NSTableView中的更新更新数据源,我们对基于单元格的表视图没有任何排序:

tableView:setObjectValue:forTableColumn:row:

建议使用目标操作模式。所以,我基本上有两个问题:

  1. 如果我为一个特定视图或其子视图设置目标和操作,如何获取正确的行和列信息以了解数据源中的更新内容?
  2. 来自NSTableView的clickedRow和clickedColumn应该做什么,虽然我已经编辑或更改了一个子视图对象?

    1. 如果操作将传递给NSTextField作为参数,我如何通知目标(作为其他对象,而不是NSTableView实例)关于行和列?
    2. 我基本上可以通过子视图来clickedColumn和clickedRow(如果这两个属性是对第一个问题的正确答案),但我发现这是非常优雅的解决方案并且预感有更好的方法....

      提前谢谢......

2 个答案:

答案 0 :(得分:2)

NSTableCellView有一个objectValue。大概你已经设置了它,所以动作可以使用[(NSTableCellView *)[sender superview] objectValue]找出它需要操纵的对象。

我建议您也将NSTableCellView子类化并在那里实施操作。如果需要访问模型的其他部分,可以为视图控制器添加插座。

如果您确实需要行号,可以在内容数组上调用indexOfObject

答案 1 :(得分:1)

两个NSTableView方法rowForView和columnForView应该可以解决问题。 您可以使用目标/操作方法的发送方来调用它们,就像在TableView中由NSButton触发的那样(确定,将它放在子视图中的某个位置) 或者,您可以在委托方法实现中调用这些方法,例如来自NSTextDelegate的textDidChange。因此,您可以轻松更新相应的阵列。 如果你不想连续更新textDidEndEditing也可以完成这项工作。

- (void)textDidChange:(NSNotification *)notification
{
    NSTextView *tv = [notification object];
    int r = [tableView rowForView:tv];
    int c = [tableView columnForView:tv];
    NSLog(@"Row: %d Column: %d", r, c);
    // updating code here
}