NSSplitViewController子视图未添加

时间:2015-07-28 21:39:19

标签: macos swift cocoa nssplitview

我创建了一个简单的NSViewController,并希望只使用一个子视图添加拆分视图。拆分视图应由NSSplitViewController控制,因为我想使用NSSplitItem的工具来折叠/扩展拆分项。添加子视图控制器后,将创建拆分项,但无子视图将添加到视图树中。

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

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

2 个答案:

答案 0 :(得分:2)

&#34;你做错了&#34;

当NSSplitViewController具有非常特殊的API时,您正在使用基类方法。

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

您需要addSplitViewItem:方法。

答案 1 :(得分:0)

我明白了。我的错误是我添加了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)
因为我上面的错误,这对我不起作用。