如何在Swift + Storyboards中按项目名称访问splitViewItems

时间:2015-07-10 10:49:10

标签: storyboard swift2 xcode7 nssplitviewcontroller

我目前正在使用一个NSSplitViewController,它有一个两个子分割视图项(一个是View Controller,另一个是另一个Split View Controller,如图所示:

enter image description here

我想以编程方式访问拆分视图项以从窗口控制器更改折叠状态(以及稍后的其他一些属性)。

我可以使用以下方法轻松访问拆分视图项目:

    let myMainSplitViewController = self.contentViewController as! NSSplitViewController
    let mySplitViewController2 = myMainSplitViewController.splitViewItems[1]
    mySplitViewController2.collapsed = !mySplitViewController2.collapsed

我认为从长远来看使用位置(示例中为1)不是一个好主意(例如,如果我将来重新排列拆分项目)。是否有办法使用更长久的链接访问拆分视图项,感谢索引号?

我想我可以尝试将Storyboard ID分配给拆分视图项的控制器,并使用数组过滤器方法按名称搜索确切的一个,但这可能有点麻烦......是否有更简单的方法像这样?:

myMainSplitViewController.splitViewItems["My Split View Controller 2"] 

1 个答案:

答案 0 :(得分:1)

如果拆分视图项具有自定义控制器,则可以通过NSSplitViewController.splitViewItemForViewController(viewController: NSViewController)访问它们。

我会为每个视图控制器声明一个协议:

protocol MainSplitViewControllerProtocol {
  var thisSplitItemController: ThisSplitViewItemControllerProtocol? {get set}
  var thatSplitItemController: ThatSplitViewItemControllerProtocol? {get set}
}

protocol ThisSplitViewItemControllerProtocol {
  //any contracts you need here
}

protocol ThatSplitViewItemControllerProtocol {
  //any contracts you need here
}

然后我要声明我的具体课程:

class MainSplitViewController: NSSplitViewController, MainSplitViewControllerProtocol {
  var thisSplitItemController: ThisSplitViewItemControllerProtocol?
  var thatSplitItemController: ThatSplitViewItemControllerProtocol?
  var thisSplitViewItem: NSSplitViewItem?
  var thatSplitViewItem: NSSplitViewItem?

  override func viewWillAppear() {
    thisSplitViewItem = thisSplitItemController != nil ? self.splitViewItemForViewController(thisSplitItemController as! NSViewController : nil)
    thatSplitViewItem = thatSplitItemController != nil ? self.splitViewItemForViewController(thatSplitItemController as! NSViewController : nil)
  }
}

class ThisViewController: NSViewController, ThisSplitViewItemControllerProtocol {
  var parent: MainSplitViewControllerProtocol?

  override func viewdidLoad() {
    super.viewDidLoad()
    parent = (self.parentViewController as! MainSplitViewControllerProtocol)
    parent?.thisSplitItemController = self
  }
}

class ThatViewController: NSViewController, ThatSplitViewItemControllerProtocol {
  var parent: MainSplitViewControllerProtocol?

  override func viewdidLoad() {
    super.viewDidLoad()
    parent = (self.parentViewController as! MainSplitViewControllerProtocol)
    parent?.thatSplitItemController = self
  }
}

现在我可以访问拆分视图项,无论它们在父的splitViewItems数组中的索引如何:

extension MainSplitViewController {
  func toolbarButtonClick(button: NSButton) {
    thisSplitViewItem?.collapsed = !thisSplitViewItem?.collapsed
    thatSplitViewItem?.collapsed = !thatSplitViewItem?.collapsed
  }
}

通过使用协议,我还解耦了所有视图控制器,因此可以轻松地交换视图。如果需要从另一个NSSplitViewItem控制其中一个NSSplitViewItems(或任何其他属性)的折叠状态,请将相关的NSSplitViewItem添加为NSSplitViewController协议的属性。