动态隐藏NSTableView中的列
我想根据基本上将要显示的数据动态隐藏/显示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)的数据,只需跳过空白列即可。