【问题标题】:Hide Show/Hide button for group rows in NSOutlineView隐藏 NSOutlineView 中组行的显示/隐藏按钮
【发布时间】:2018-05-08 16:42:04
【问题描述】:

我的 NSOutlineView 有一些不能折叠的组行,类似于 Mail.app 无法隐藏“邮箱”组。如果代理的shouldCollapseItem 方法返回false,我希望显示/隐藏悬停按钮被禁用,但情况似乎并非如此。

我尝试使用以下委托手动禁用它:

func outlineView(_ outlineView: NSOutlineView, willDisplayOutlineCell cell: Any, for tableColumn: NSTableColumn?, item: Any) {
    if outlineView.delegate?.outlineView?(outlineView, shouldCollapseItem: item) == false {
        if let view = outlineView.delegate?.outlineView?(outlineView, viewFor: tableColumn, item: item) {
            if let button = view.subviews.first(where: { $0.identifier == NSOutlineView.showHideButtonIdentifier }) {
                button.isHidden = true
            }
        }
    }
}

但这不起作用,因为返回的视图只是将要呈现的NSTableCellView,并且在调用此委托时它没有超级视图(所以我无法寻找兄弟视图)。

我可以访问 makeView(withIdentifier:owner:) 委托中的“显示/隐藏”按钮(这是一个未记录的 NSOutlineButtonCell 实例),但此时我不知道它是否代表可以隐藏的组之一或不是。

必须有办法做到这一点,因为 Mail.app(和其他应用程序)能够有条件地禁用组的显示/隐藏按钮。

【问题讨论】:

  • 强烈建议您不要调用包含didwillshould 甚至outlineView(viewFor 的委托方法。不要那样做。这些方法仅由框架调用。
  • 很好的建议。无论如何,正如我所指出的,它不起作用。这就是我最初的问题。

标签: swift macos appkit nsoutlineview


【解决方案1】:

实施

func outlineView(_ outlineView: NSOutlineView, shouldShowOutlineCellForItem item: Any) -> Bool

并返回 false 以隐藏单元格

【讨论】:

  • 成功了!文档说它只影响显示三角形,但我猜显示/隐藏按钮相当于三角形。
猜你喜欢
  • 2021-11-27
  • 2021-06-05
  • 1970-01-01
  • 1970-01-01
  • 2016-05-21
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多