我目前正在使用一个NSSplitViewController,它有一个两个子分割视图项(一个是View Controller,另一个是另一个Split View Controller,如图所示:
我想以编程方式访问拆分视图项以从窗口控制器更改折叠状态(以及稍后的其他一些属性)。
我可以使用以下方法轻松访问拆分视图项目:
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"]
答案 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协议的属性。