我正在尝试构建此应用程序,其中列'包名称'从核心数据填充。第二列在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列都是可排序的。
由于
答案 0 :(得分:2)
不要咨询表格的单元格。相反,直接转到数据源,或者,如果您正在使用绑定,则转到阵列控制器。
首先,在基于NSCell
的表视图中,整个列通常只有一个单元格对象。它被重用了。它被配置为第一行并被要求在该行的适当位置绘制。然后,它被配置为第二行并被要求在第二行的适当位置绘制。等等。因此,检索单元格不会为您提供任何特定行的数据。单元格将具有上次为行配置时所具有的任何属性,这可能是与您感兴趣的行完全不同的行。
(你可以通过使用-[NSTableView preparedCellAtColumn:row:]
要求准备好的单元格来解决这个问题。但这确实是迂回的做法。表视图只需要咨询数据源以准备单元格。)
如果您使用的是阵列控制器,那么您的窗口/视图控制器应该有一个阵列控制器的插座。然后,您可以通过调用:
获取给定行的相应模型对象object = [self.arrayController.arrangedObjects objectAtIndex:row];
如果您对所选对象感兴趣并且绑定设置正确,您可以直接从阵列控制器获取所选模型对象:
object = self.arrayController.selectedObjects[0];
或者:
for (object in self.arrayController.selectedObjects)
{
// ...
}
但请注意,选中第二列中的复选框与选择行有所不同。根据表的配置方式,用户可以在没有另一个的情况下执行任何操作。例如,他们可以通过单击第一列来选择一行,这不会检查另一列中的复选框。他们还可以使用键盘更改选择(例如向下箭头)。