如何在 Swift + 故事板中按项目名称访问 splitViewItems

How to access splitViewItems by item name in Swift + Storyboards

我目前正在使用具有两个子拆分视图项的 NSSplitViewController(一个是视图控制器,一个是另一个拆分视图控制器,如图所示:

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

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

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

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

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

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

如果您的拆分视图项目有自定义控制器,您可以通过 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 控制其中一个 NSSplitViewItem(或任何其他属性)的折叠状态,请将相关的 NSSplitViewItem 作为 属性 添加到您的 NSSplitViewController 协议中。