通过 OS X 故事板中的标识符实例化拆分视图控制器不会加载视图层次结构

Instantiating split view controller by identifier in OS X storyboard does not load view hierarchy

我正在尝试在 Swift OS X 应用程序中实现主从细节视图。顶层视图控制器是一个带有三个子视图控制器的 NSSplitViewController。主视图和第一个细节视图相当标准,具有固定的行为。第二个详细视图需要根据第一个详细视图中的选择进行更改。

第二个细节控制器是一个简单的视图控制器,它将通过根据选择安装新的子视图和控制器来响应第一个细节视图中的选择更改。

最终内容的备用视图控制器是在同一个故事板中实现的,没有通过 segues 连接到任何东西;目的是使用 -[NSStoryboard instantiateControllerWithIdentifier:] 创建它们并将它们安装为子视图控制器和子视图。

实例化的视图控制器恰好是 NSSplitViewControllers。

问题是:当我实例化细节拆分视图控制器并安装它们时,它们是空的。到目前为止我能够观察到的是:

我需要做些什么才能完全 load/populate 加载的拆分视图控制器吗?

TIA, 道格

找到了。我正在尝试将实例化的 NSSplitViewController 的 "splitView" 添加为子视图,而不是其 "view"(包含 splitView)。访问 "view" 属性 加载视图层次结构;使用 "splitView" 没有。

如果您将拆分视图控制器添加到故事板并删除与提供的两个拆分视图项的连接,您可以使用 addChildViewController 添加它们:并且您必须为这些视图设置故事板 ID

class SplitViewController: NSSplitViewController {

@IBOutlet weak var mySplitView: NSSplitView!

var leftPane: NSViewController?
var contentView: NSViewController?

override func viewDidLoad() {
    super.viewDidLoad()
    let story = self.storyboard

    leftPane = story?.instantiateController(withIdentifier: "LeftPaneViewController") as! LeftPaneViewController?
    contentView = story?.instantiateController(withIdentifier: "ContentViewController") as! ContentViewController?

    self.addChildViewController(leftPane!)
    self.addChildViewController(contentView!)
}

}

在我的例子中,我在 init?(coder:) 内的 NSSplitViewController 子类中调用 addSplitViewItem(),这太早了。一旦我将调用移动到 viewDidLoad(),每个 spit 视图项的视图控制器的视图层次结构被添加到拆分视图控制器的视图层次结构中,并且一切正常。