通过上下文菜单隐藏 NSTableView(或 NSOutlineView)列:"no code" 解决方案
NSTableView (or NSOutlineView) column hiding through contextual menu : a "no code" solution
我在 SO 中搜索了这个问题的最佳解决方案,找到了一些线索,但并不完全满足 IMO。所以我 post 低于我的 no-code 解决方案。
目标是像在 Finder 或其他本机应用程序中一样,在 table 或大纲的 header 栏上有一个上下文菜单,允许 select 哪些列可见。
在 IB 故事板中,将您需要的所有列添加到 table 视图中。
您可以将其中一些设置为默认隐藏。
Ctrl-drag每一列从IB文档大纲视图到场景控制器代码视图,为每一列自动创建weak IBOutlets。目的是能够针对绑定中的给定列。
__weak IBOutlet NSTableColumn *my_column;
向故事板场景添加一个菜单,其项目数与您计划隐藏的列数相同。您不必为菜单项提供标题(请参阅下一点)。
对于每个菜单项,在绑定窗格中添加两个绑定:
- 通过您的控制器插座将项目
title
绑定到列 title
属性:controller_name.my_column.title
。这样,菜单项将与列标题保持同步,以防代码需要更改它。
- 这是关键:将菜单项的
value
绑定到列 hidden
属性 : controller_name.my_column.hidden
。添加一个 NSNegateBoolean
转换器以使菜单勾选有意义。
将菜单附加到 header 菜单:ctrl-click 在 table header 视图上,并从菜单出口连接到创建的菜单在#3.
就是这样。 #2 中添加的 IBOutlets 旁边没有代码。
绑定有两种方式,un-ticking菜单项将隐藏绑定的列。此外,如果代码隐藏了一个列,绑定的菜单项将反映其状态。
我在 SO 中搜索了这个问题的最佳解决方案,找到了一些线索,但并不完全满足 IMO。所以我 post 低于我的 no-code 解决方案。 目标是像在 Finder 或其他本机应用程序中一样,在 table 或大纲的 header 栏上有一个上下文菜单,允许 select 哪些列可见。
在 IB 故事板中,将您需要的所有列添加到 table 视图中。 您可以将其中一些设置为默认隐藏。
Ctrl-drag每一列从IB文档大纲视图到场景控制器代码视图,为每一列自动创建weak IBOutlets。目的是能够针对绑定中的给定列。
__weak IBOutlet NSTableColumn *my_column;
向故事板场景添加一个菜单,其项目数与您计划隐藏的列数相同。您不必为菜单项提供标题(请参阅下一点)。
对于每个菜单项,在绑定窗格中添加两个绑定:
- 通过您的控制器插座将项目
title
绑定到列title
属性:controller_name.my_column.title
。这样,菜单项将与列标题保持同步,以防代码需要更改它。 - 这是关键:将菜单项的
value
绑定到列hidden
属性 :controller_name.my_column.hidden
。添加一个NSNegateBoolean
转换器以使菜单勾选有意义。
- 通过您的控制器插座将项目
将菜单附加到 header 菜单:ctrl-click 在 table header 视图上,并从菜单出口连接到创建的菜单在#3.
就是这样。 #2 中添加的 IBOutlets 旁边没有代码。
绑定有两种方式,un-ticking菜单项将隐藏绑定的列。此外,如果代码隐藏了一个列,绑定的菜单项将反映其状态。