我应该如何构建我的OS X应用程序的NSWindow / Views / ViewControllers?

时间:2015-11-30 02:21:28

标签: swift macos cocoa nsviewcontroller

问题可能是几个较小的问题,但总的来说,我真的很难理解构建我的Swift应用程序的NSWindow / Views / ViewControllers的“最佳实践”。有人可以告诉我这样做的“正常方式”是什么?

我正在构建一个包含一个窗口的应用程序,其中包含一个拆分视图。左侧拆分将包含一个源列表,右侧将在几个详细视图之一之间切换。我曾经想过一个非常常见的场景。

我的目标是OS X 10.10+,我希望将ViewControllers用于我应用中的重要视图。我并不热衷于使用故事板,因为我仍然在学习自己的方式,而且在这一点上它们似乎有点“神奇”。

我尝试了什么:

  • 我首先在MainWindowController.xib内直接在IB中构建我的所有观点。我很快得到了一个膨胀的MainWindowController.swift,因为它包含了我的所有代码(例如,它是我的源列表的委托和数据源)

我决定将所有内容拆分为NSViewControllers,但是:

  • 我不确定在哪里实例化它们,特别是如果它们的视图保存在MainWindowController.xib
  • 通过在IB中的视图控制器中拖动来实例化视图控制器是否奇怪(即它出现在IB的LHS上的“对象”列表中)?
  • 使用NSViewControllers强制要求每个控制器的视图都在自己的XIB中(假设我不想在代码中创建它)?
  • 如果是的话,似乎你有许多毫无意义的XIB,例如整个XIB只包含一个空的NSWindow
  • 如果这是真的,你会抛弃XIB来寻找无意义的,并在代码中创建它的视图(例如在代码中创建NSWindow)吗?

当我继续将它全部拆分为多个XIB和相应的视图控制器(由于上述原因在代码中创建我的NSWindow)时,我得到了一些方法但注意到我的拆分视图不再有分隔符。我的研究表明,如果你对NSSplitView进行子类化会发生这种情况,但我认为我没有这样做(至少不是故意的)。

class AppDelegate: NSObject, NSApplicationDelegate {
    var window: NSWindow?

    func applicationDidFinishLaunching(aNotification: NSNotification) {
        let splitViewController = CMSplitViewController()
        let window = NSWindow(contentViewController: splitViewController)
        window.makeKeyAndOrderFront(self)
        self.window = window
    }

class CMSplitViewController: NSSplitViewController {

    override var nibName: String? {
        return "CMSplitViewController"
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do view setup here.
    }
}

...其中CMSplitViewController.xib只包含一个NSSplitView(当然还有子视图),从对象库拖入IB。

0 个答案:

没有答案