1

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

在此处输入图像描述

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

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

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

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

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

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

1 回答 1

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 协议中。

于 2016-07-03T19:44:55.313 回答