通过上下文菜单隐藏 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 哪些列可见。

  1. 在 IB 故事板中,将您需要的所有列添加到 table 视图中。 您可以将其中一些设置为默认隐藏。

  2. Ctrl-drag每一列从IB文档大纲视图到场景控制器代码视图,为每一列自动创建weak IBOutlets。目的是能够针对绑定中的给定列。

    __weak IBOutlet NSTableColumn *my_column;
    
  3. 向故事板场景添加一个菜单,其项目数与您计划隐藏的列数相同。您不必为菜单项提供标题(请参阅下一点)。

  4. 对于每个菜单项,在绑定窗格中添加两个绑定:

    • 通过您的控制器插座将项目 title 绑定到列 title 属性:controller_name.my_column.title。这样,菜单项将与列标题保持同步,以防代码需要更改它。
    • 这是关键:将菜单项的 value 绑定到列 hidden 属性 : controller_name.my_column.hidden。添加一个 NSNegateBoolean 转换器以使菜单勾选有意义。
  5. 将菜单附加到 header 菜单:ctrl-click 在 table header 视图上,并从菜单出口连接到创建的菜单在#3.

就是这样。 #2 中添加的 IBOutlets 旁边没有代码。

绑定有两种方式,un-ticking菜单项将隐藏绑定的列。此外,如果代码隐藏了一个列,绑定的菜单项将反映其状态。