NSSplitViewController 子视图未添加

NSSplitViewController Child View Not Added

我创建了一个简单的 NSViewController 并想添加一个只有一个子视图的拆分视图。拆分视图应由 NSSplitViewController 控制,因为我想将 NSSplitItem 的功能用于 collapsing/expanding 拆分项目。添加子视图控制器后,创建了拆分项,但是没有子视图添加到视图树中。

override func viewDidLoad() {
    super.viewDidLoad()
    let splitViewController = NSSplitViewController()
    view.addSubview(splitViewController.splitView)

    let myController = MyController(nibName: "MyController", bundle: nil)
    splitViewController.addChildViewController(myController)

    printTree(view)
}

func printTree(view: AnyObject, _ n: Int = 1) {
    if let view = view as? NSView {
        NSLog("\(n): \(view)")
        for child in view.subviews {
            printTree(child, n + 1)
        }
    }
}

输出:

1: <NSView: 0x618000120140>
2: <NSSplitView: 0x6180001205a0>

为什么拆分视图没有子视图?


为了比较,这里是没有拆分视图的版本:

override func viewDidLoad() {
    super.viewDidLoad()
    let myController = MyController(nibName: "MyController", bundle: nil)
    view.addSubview(myController.view)
    printTree(view)
}

输出:

1: <NSView: 0x6100001203c0>
2: <NSView: 0x6000001208c0>  <-- here's my child view
3: <NSButton: 0x600000140580>

并且直接将子视图作为子视图添加到拆分视图中也不起作用:

A SplitView managed by a SplitViewController cannot have its subviews modified

所以,我的问题是,为什么子视图没有添加到拆分视图内的视图树中?

"You're doing it wrong"

当 NSSplitViewController 具有非常特殊的 API.

时,您正在使用基础 class 方法

请参阅:https://developer.apple.com/library/prerelease/mac/samplecode/Exhibition/Listings/Exhibition_GalleryWindowController_swift.html 示例。

您需要 addSplitViewItem: 方法。

我明白了。我的错误是我添加了 splitView 而不是 view:

// this won't work:
self.view.addSubview(splitViewController.splitView)

// this will work:
self.view.addSubview(splitViewController.view)

顺便说一句:像我之前那样使用 splitViewController.addChildViewController(myController) 只是以下内容的一种更简短的表达方式:

let item = NSSplitViewItem(viewController: myController)
splitViewController.addSplitViewItem(item)

由于我的上述错误,这对我不起作用。