【问题标题】:How to access splitViewItems by item name in Swift + Storyboards如何在 Swift + Storyboards 中按项目名称访问 splitViewItems
【发布时间】:2016-07-04 16:52:26
【问题描述】:

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

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

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

    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"] 

【问题讨论】:

    标签: storyboard swift2 xcode7 nssplitviewcontroller


    【解决方案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 协议中。

    【讨论】:

    • @gbdavid 太棒了!乐意效劳;我只花了一年的时间就做到了!
    猜你喜欢
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 1970-01-01
    • 2020-04-12
    • 2017-01-29
    • 2019-02-02
    相关资源
    最近更新 更多