【发布时间】: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(和其他应用程序)能够有条件地禁用组的显示/隐藏按钮。
【问题讨论】:
-
强烈建议您不要调用包含
did、will、should甚至outlineView(viewFor的委托方法。不要那样做。这些方法仅由框架调用。 -
很好的建议。无论如何,正如我所指出的,它不起作用。这就是我最初的问题。
标签: swift macos appkit nsoutlineview