动态隐藏NSTableView中的列

时间:2020-03-05 18:55:01  来源:igfitidea点击:

我想根据基本上将要显示的数据动态隐藏/显示NSTableView中的某些列,如果某列为空,我希望该列被隐藏。我目前正在使用控制器类作为该表的代表填充该表。

有任何想法吗?我看到我可以将列设置为在Interface Builder中隐藏,但是似乎没有什么好时间浏览这些列并检查它们是否为空,因为似乎没有一种方法可以在表中的所有数据填充之前/之后调用。

解决方案

回答

目前我还没有完整的答案,但是请研究Bindings。通常可以使用可可绑定来做各种各样的事情。

NSTableColumn没有可见性绑定,但是我们可以将宽度设置为0。

然后,我们可以将其绑定到Null占位符,并将该值设置为0,但是不要忘记将其他占位符设置为合理的值。

(正如我所说,这只是一个开始,可能需要进行一些调整)。

回答

没有一次可以填充所有数据。 NSTableView不存储数据,而是动态地从其数据源(或者绑定对象,如果我们使用绑定)中请求数据。它只是使用从数据源获取的数据进行绘制并进行沟渠处理。例如,我们不应看到表格要求提供任何不可见数据的数据。

听起来我们正在使用数据源?当数据更改时,我们有责任在表上调用-reloadData,这有点用词不当。更像是"使一切无效"。

也就是说,我们应该已经知道何时更改数据。在这一点上,我们可以计算应隐藏哪些列。

回答

我已经使用绑定完成了此操作,但是通过编程而不是通过Interface Builder来设置它们。

这个伪代码片段应为我们提供要点:

NSTableColumn *aColumn = [[NSTableColumn alloc] initWithIdentifier:attr];
[aColumn setWidth:DEFAULTCOLWIDTH];
[aColumn setMinWidth:MINCOLWIDTH];
[[aColumn headerCell] setStringValue:columnLabel];

[aColumn bind:@"value"
     toObject:arrayController 
  withKeyPath:keyPath 
  options:nil];             

[tableView addTableColumn:aColumn];
[aColumn release];

当然,我们也可以添加格式化程序以及所有其他内容。

回答

@amrox如果我正确理解了建议,那是说我应该将一个值绑定到表中NSTableColumns的hidden属性上吗?这似乎可行,但是我不认为NSTableColumn具有隐藏属性,因为isHidden和setHidden消息控制该列的可见性,这告诉我这不是属性,除非我遗漏了一些东西(这很有可能)。

回答

NSTable只是绘制表的类。正如我们自己说的,我们有一些类可以将表作为委托,而该类将要显示的数据馈入表。如果将表数据作为NSArray的表数据存储在委托类中,那么应该很容易找出一列是否为空,不是吗?然后NSArray通过委托方法问类有多少列,所以当我们被问到时,为什么不查找有数据的列并报告该数字而不是内部存储的实际列数,然后问提供(column,row)的数据,只需跳过空白列即可。