隐藏 NSOutlineView 中组行的显示/隐藏按钮

mar*_*rux 1 macos nsoutlineview appkit swift

我的 NSOutlineView 有一些组行无法折叠,类似于 Mail.app 无法隐藏“Mailboxes”组。我希望如果委托的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
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

vad*_*ian 5

实施

func outlineView(_ outlineView: NSOutlineView, shouldShowOutlineCellForItem item: Any) -> Bool
Run Code Online (Sandbox Code Playgroud)

并返回false要隐藏的单元格