Swift / Cocoa:如何将值绑定到当前选定的选项卡

时间:2017-02-25 04:21:54

标签: swift cocoa binding key-value-observing nstabview

使用偏好设置窗格。我有一个NSTabView;选项卡是从XIB动态创建的。他们都非常相似,但不完全相同。因此,根据当前选择的选项卡,我需要更改某些值(以及某些控件显示或消失)。

通常人们会认为可以绑定到NSTabView.selectedTabViewItem;但这不起作用。为什么?该值永远不会更新。

然后我变得更有创意,并想到制作一个计算属性,该属性返回要观察的绑定的适当值。仍然没有骰子。应用程序启动时会对绑定进行评估,并且永远不会更新。

然后我决定乱七八糟地制作一个委托来实现tabView的didSelect方法,从而将当前选中的选项卡写入绑定可以观察的存储属性。

最后一种方法有效,但感觉非常笨重和肮脏。有谁知道更好的方法吗?

编辑:我试图实现NSTabViewController,但我无法让它工作!

如果我手动将NSTabViewController绑定到我在IB中创建的NSTabView对象,则所有内容似乎都已正确初始化,但标签永远不会显示。并且,如果我尝试初始化控制器中的所有内容,然后通过NSTabViewController.tabView属性分配NSTabView,我得到

A TabView managed by a TabViewController cannot have its delegate modified

这很奇怪,因为我试图按照这样做的方式去做 cumentation指定。事实上,即使我尝试TabViewController.tabView = NSTabView(),我也会遇到同样的错误。这是一个错误吗?

这是我的代码的整个相关部分,

@IBOutlet weak var theTabView: NSTabView?
@IBOutlet weak var tabViewDelegate: NSTabViewController?
    override func assignMainView() {
    ControllersRef.sharedInstance.tabViewController = self.tabViewController
    ControllersRef.sharedInstance.theTabView = self.theTabView
    ControllersRef.sharedInstance.thePrefPane = self
    let tabs = ["Internet", "URL Schemes", "Uniform Type Identifiers", "Applications"]

    if let tabViewDelegate = self.tabViewDelegate {
        for tab in tabs {
            let newTab = NSTabViewItem(viewController: NSViewController.init()) // I tried doing it the other way around also, i.e. via addChildViewController() and tabItem(for:), but the result was the same.

            newTab.label = tab
            let newTabViewItemView = DRYView.init()
            newTabViewItemView.nibName = "SWDAPrefpaneTabTemplate"

            tabViewDelegate.addChildViewController(newTab.viewController!)
            newTab.viewController!.view = newTabViewItemView

        }
        let views = tabViewDelegate.childViewControllers
        tabViewDelegate.tabView = ControllersRef.sharedInstance.theTabView

    }
    super.assignMainView()
}

1 个答案:

答案 0 :(得分:1)

您应该能够使用NSTabViewController及其selectedTabViewItemIndex属性,该属性具体记录为符合绑定。

如果需要,可以创建一个构建在selectedTabViewItemIndex之上的计算属性,以映射到所选项目的相应模型对象。执行此操作时,请务必实现类方法keyPathsForValuesAffecting<Key>以返回["selectedTabViewItemIndex"],以便KVO知道在selectedTabViewItemIndex更改时您的计算属性会更改。

(这可能不足以使您已尝试过的计算属性有效,因为NSTabView的{​​{1}}本身并未记录为符合KVO标准。)