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

时间:2015-11-09 02:32:58

标签: swift macos nsstoryboard nssplitviewcontroller

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

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

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

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

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

  • 实例化的视图控制器属于正确的类(NSSplitViewController的子视图);
  • 他们没有子视图
  • 他们有splitViewItems,而splitViewItems是我期望看到加载的视图控制器

完全加载/填充已加载的拆分视图控制器需要做些什么吗?

TIA, 道格

3 个答案:

答案 0 :(得分:1)

找到它。我正在尝试添加实例化的NSSplitViewController" splitView"作为一个子视图,而不是它的视图" (包含splitView)。访问"视图" property加载视图层次结构;使用" splitView"没有。

答案 1 :(得分:1)

如果您将拆分视图控制器添加到情节提要并删除与提供的两个拆分视图项的连接,您可以使用addChildViewController添加它们:并且您必须为这些视图设置Storyboard 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!)
}

}

答案 2 :(得分:0)

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