从NSOutlineView中检索单元格内容

时间:2011-08-19 15:35:50

标签: objective-c cocoa nsoutlineview nscell

我有一个奇怪的问题与NSOutlineView一起出现。视图本质上是一个包含相关文件作为子项的应用程序列表。我在其数据源中手动填充视图,所有这些工作正常。我现在想要做的是有一个删除项目的按钮。为了做到这一点,我实现了一个方法removeAppOrFile,如下所示:

- (IBAction)removeAppOrFile:(id)sender
{
    NSInteger selectedRow = [myView selectedRow];
    if (selectedRow == -1) //ie. nothing's selected
    {
        return;
    }  
    NSTableColumn *col = [myView tableColumnWithIdentifier:@"Column 1"];
    NSCell *cell = [col dataCellForRow:selectedRow];
    NSString *item = [cell stringValue];
    NSLog(@"The row is: %ld\nThe column is: %@\nThe cell is: %@\nThe selected item is: %@",selectedRow, col, cell, item); // For testing purposes
}

myView是一个连接到我的NSOutlineView的IBOutlet。 如果我选择一个不同的行并单击按钮,selectedRow的值将正确更改,但NSCell对象永远不会更改,它应该是什么值(即NSString项)始终显示最后一个可见项的值(即,如果有的话)将子项作为最后一项的项目如果NSString项目未展开,则NSString项目将成为父项目,如果展开,则为最后一项项目。

奇怪的是,我在其他地方使用基本相同的代码在NSOutlineView上使用doubleAction,它运行得很好。在这种情况下,代码如下:

- (void)editedAppOrFile:(id)sender 
{
    NSInteger rowNumber = [sender clickedRow];
    NSTableColumn *col = [sender tableColumnWithIdentifier:@"Column 1"];
    NSCell *cell = [col dataCellForRow:rowNumber];
    NSString *item = [cell stringValue];
    NSLog(@"The row is: %ld\nThe column is: %@\nThe cell is: %@\nThe selected item is: %@",selectedRow, col, cell, item); // For testing purposes
}

在这种情况下,sender是outlineView。项目&细胞更改与rowNumber更改。

知道为什么它不适用于第一个例子吗?

1 个答案:

答案 0 :(得分:3)

您的方法存在一些问题。

  1. 您正在获取数据单元格,而不是-preparedCellAtColumn:row:,因此您无法保证其内部对象值将是什么。
  2. 您可以直接询问大纲视图-itemAtRow:
  3. 如果您尝试删除(在第一种情况下)或编辑(第二种情况),您实际上只需要修改数据源,然后记录更改的行数(第一种情况)或重新加载行数据(第二种情况)。