我创建了一个简单的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
所以,我的问题是,为什么子视图没有添加到拆分视图内的视图树中?
答案 0 :(得分:2)
&#34;你做错了&#34;
当NSSplitViewController具有非常特殊的API时,您正在使用基类方法。
您需要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)
因为我上面的错误,这对我不起作用。