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 方法
您需要 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)
由于我的上述错误,这对我不起作用。
我创建了一个简单的 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 方法您需要 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)
由于我的上述错误,这对我不起作用。