我可以通过Interface Builder成功地将NSTreeController绑定到NSOutlineView。当我尝试用编程方式做同样的事情时,我也可以让它工作,除了一个小问题。
调整轮廓视图所固定的窗口大小,将折叠所有打开的项目。如果我以其他方式调整大纲视图的大小,比如把它放在NSSplitView中,上下移动滑块不会造成任何问题。只有当我调整窗口大小时才会发生。
outline视图只是Interface Builder中的默认视图。我把它放在一个窗口,固定所有的四个边,连接出口到我的ViewController,就是这样。
有人有什么见解吗?谢谢。
我是这样用编程方式创建东西的:
override func viewWillLayout() {
super.viewWillLayout()
var treeController: NSTreeController!
@IBOutlet weak var outlineView: NSOutlineView!
var content = [TreeNode]()
newTreeController = NSTreeController.init(content: nil)
newTreeController.objectClass = TreeNode.self
newTreeController.childrenKeyPath = "children"
newTreeController.countKeyPath = "count"
newTreeController.leafKeyPath = "leaf"
newTreeController.preservesSelection = true
newTreeController.isEditable = true
newTreeController.bind("contentArray", to: self, withKeyPath: "content", options: nil)
outlineView.delegate = self
outlineView.bind("content", to: newTreeController, withKeyPath: "arrangedObjects", options: nil)
outlineView.bind("selectionIndexPaths", to: newTreeController, withKeyPath: "selectionIndexPaths", options: nil)
}
override func viewDidLoad() {
super.viewDidLoad()
willChangeValue(forKey: "content")
// POPULATE CONTENT ARRAY
didChangeValue(forKey: "content")
}
// NSOutlineViewExtension
func outlineView(_ outlineView: NSOutlineView, viewFor tableColumn: NSTableColumn?, item: Any) -> NSView? {
var cellView: NSTableCellView?
if let identifier = tableColumn?.identifier {
if let view = outlineView.make(withIdentifier: identifier, owner: outlineView.delegate) as? NSTableCellView {
// view.imageView?.bind(NSValueBinding, to: view, withKeyPath: "objectValue.WHATEVER_PROPERTY", options: nil)
// view.textField?.bind(NSValueBinding, to: view, withKeyPath: "objectValue.WHATEVER_PROPERTY", options: nil)
cellView = view
}
}
return cellView
}
viewWillLayout()是设置树形控制器和大纲视图的错误位置。它被反复调用,并不是用来做这类事情的。
将所有内容移动到viewDidLoad()中,问题就解决了