【发布时间】:2020-11-15 12:38:09
【问题描述】:
我已经启动了一个新的 macOS 项目(目前在 Big Sur beta 3 上),NSOutlineView 节点似乎已损坏。不知道这是我还是操作系统。
Here's a sample project 证明了这个问题。还有一张图……
如您所见,单元格与扩展人字形重叠。单击任一 V 形将第一行恢复为正确的布局,但不是第二行。此外,永远不会调用自动保存方法 persistentObjectForItem 和 itemForPersistentObject。
测试项目非常简单——我所做的只是将视图库中的SourceView 组件添加到默认应用项目中,并将委托/数据源连接到视图控制器。还检查了 IB 中的 Autosave Expanded Items 并在 Autosave 字段中输入名称。这是整个控制器代码:
class ViewController: NSViewController {
@IBOutlet var outlineView: NSOutlineView?
let data = [Node("First item", 1), Node("Second item", 2)]
}
extension ViewController: NSOutlineViewDataSource {
func outlineView(_ outlineView: NSOutlineView, child index: Int, ofItem item: Any?) -> Any {
data[index]
}
func outlineView(_ outlineView: NSOutlineView, isItemExpandable item: Any) -> Bool {
true
}
func outlineView(_ outlineView: NSOutlineView, numberOfChildrenOfItem item: Any?) -> Int {
item == nil ? data.count : 0
}
func outlineView(_ outlineView: NSOutlineView, objectValueFor tableColumn: NSTableColumn?, byItem item: Any?) -> Any? {
item
}
func outlineView(_ outlineView: NSOutlineView, persistentObjectForItem item: Any?) -> Any? {
(item as? Node)?.id
}
func outlineView(_ outlineView: NSOutlineView, itemForPersistentObject object: Any) -> Any? {
guard let id = object as? Int else { return nil }
return data.first { $0.id == id }
}
}
extension ViewController: NSOutlineViewDelegate {
func outlineView(_ outlineView: NSOutlineView, viewFor tableColumn: NSTableColumn?, item: Any) -> NSView? {
guard let node = item as? Node else {
preconditionFailure("Invalid data item \(item)")
}
let view = outlineView.makeView(withIdentifier: nodeCellIdentifier, owner: self) as? NSTableCellView
view?.textField?.stringValue = node.name
view?.imageView?.image = NSImage(systemSymbolName: node.icon, accessibilityDescription: nil)
return view
}
}
final class Node {
let id: Int
let name: String
let icon: String
init(_ name: String, _ id: Int, _ icon: String = "folder") {
self.id = id
self.name = name
self.icon = icon
}
}
private let nodeCellIdentifier = NSUserInterfaceItemIdentifier("DataCell")
有没有 Mac 开发人员可以提供帮助?
【问题讨论】:
-
打开你的项目,选择大纲视图并将highlight属性值设置为Regular(这里有Source List)。
-
感谢@zrzka,但这是为了在侧边栏中,所以
SourceList是我正在寻找的风格。你是对的,改变风格可以解决问题,所以这可能证实它是一个错误?此外,仍然不会调用扩展状态的自动保存 -
你是否有一些你想要实现的截图?最终目标是什么?因为我没有在您的代码中看到
outlineView(_ outlineView: NSOutlineView, isGroupItem item: Any)实现等。源列表的行为有点不同 - 例如 - 项目从第 3 级缩进,......通常的结构类似于 - 顶级 = 组,第 2 级= 没有缩进的节点,可能有子节点,第 3 级 = 缩进的节点,... -
两个级别的 Finder,例如 - gist 和 screenshot。三个级别 - 相同的要点和screenshot。附言不要强行展开 (
!),我用它来快速说明我的意思。 -
还跳转到
NSOutlineView.SelectionHighlightStyle.sourceList的定义 并阅读那里的 cmets(它们不包含在文档中)。
标签: macos appkit nsoutlineview macos-big-sur