If your split view items have custom controllers you can access them via NSSplitViewController.splitViewItemForViewController(viewController: NSViewController)
.
I would declare a protocol for each view controller:
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
}
Then I'd declare my concrete classes like this:
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
}
}
Now I can access the split view items regardless of their index in the parent's splitViewItems array:
extension MainSplitViewController {
func toolbarButtonClick(button: NSButton) {
thisSplitViewItem?.collapsed = !thisSplitViewItem?.collapsed
thatSplitViewItem?.collapsed = !thatSplitViewItem?.collapsed
}
}
By using protocols I have also decoupled all the view controllers so the views can be swapped out easily. If you need to control the collapsed state of one of the NSSplitViewItems (or any other properties) from another NSSplitViewItem add the relevant NSSplitViewItem as a property to your NSSplitViewController protocol.