如何在 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 协议中。
我目前正在使用具有两个子拆分视图项的 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 协议中。