从NSTableView获取选定值

时间:2014-08-24 04:09:28

标签: objective-c cocoa nstableview

Sample Application

我正在尝试构建此应用程序,其中列'包名称'从核心数据填充。第二列在IB中添加了NSButtonCell,这个想法是每次选中一个复选框我需要在'包名称中获取相应zip文件的名称。列。

我试过这样的事情

- (void)tableViewSelectionDidChange:(NSNotification *)notification {

    NSTableView * tableView = [notification object];
    NSInteger rowIndex = [tableView selectedRow];
    NSTableColumn *column = [tableView tableColumnWithIdentifier:@"package-name"];
    NSCell *cell = [column dataCellForRow:rowIndex];
    NSLog(@"Found Value %@",cell.stringValue);    
}

但每次获得的价值都是不同的,不一致的。例如,如果我选择6ht复选框(如屏幕截图所示),我希望看到4.zip被打印,但我得到了别的东西。我该如何解决 ?

我的Package Name和Installation Status列都是可排序的。

由于

1 个答案:

答案 0 :(得分:2)

不要咨询表格的单元格。相反,直接转到数据源,或者,如果您正在使用绑定,则转到阵列控制器。

首先,在基于NSCell的表视图中,整个列通常只有一个单元格对象。它被重用了。它被配置为第一行并被要求在该行的适当位置绘制。然后,它被配置为第二行并被要求在第二行的适当位置绘制。等等。因此,检索单元格不会为您提供任何特定行的数据。单元格将具有上次为行配置时所具有的任何属性,这可能是与您感兴趣的行完全不同的行。

(你可以通过使用-[NSTableView preparedCellAtColumn:row:]要求准备好的单元格来解决这个问题。但这确实是迂回的做法。表视图只需要咨询数据源以准备单元格。)

如果您使用的是阵列控制器,那么您的窗口/视图控制器应该有一个阵列控制器的插座。然后,您可以通过调用:

获取给定行的相应模型对象
object = [self.arrayController.arrangedObjects objectAtIndex:row];

如果您对所选对象感兴趣并且绑定设置正确,您可以直接从阵列控制器获取所选模型对象:

object = self.arrayController.selectedObjects[0];

或者:

for (object in self.arrayController.selectedObjects)
{
    // ...
}

但请注意,选中第二列中的复选框与选择行有所不同。根据表的配置方式,用户可以在没有另一个的情况下执行任何操作。例如,他们可以通过单击第一列来选择一行,这不会检查另一列中的复选框。他们还可以使用键盘更改选择(例如向下箭头)。