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



在偏好窗格上工作。我有一个nstabview;选项卡是从XIB动态创建的。它们都非常相似,但并不完全相同。因此,我需要一些值才能根据当前选择选项卡进行更改(以及某些控件出现或消失)。

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

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

然后,我决定去凌乱,并做了一个代表来实现TabView的DidSelect方法,其中当前选择的选项卡将写入绑定可以观察到的存储属性。

最后一种方法有效,但感觉很笨拙和肮脏。有人知道更好的方法吗?

编辑:我正在尝试实现NSTABViewController,但我只是无法正常工作!

如果我将NSTABViewController手动绑定到IB中制作的NSTABVIEW对象,则所有内容似乎都适当初始化,但是选项卡永远不会显示。而且,如果我尝试初始化控制器中的所有内容,然后通过NSTABVIEWCONTROLLER.TABVIEW属性分配NSTABVIEW,则获得

A TabView managed by a TabViewController cannot have its delegate modified

这很奇怪,因为我试图像这样做规定。实际上,即使我尝试执行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()
}

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

如果需要,您可以创建在selectedTabViewItemIndex顶部构建的计算属性,以映射到所选项目的适当模型对象。当您这样做时,请确保实现类方法keyPathsForValuesAffecting<Key>以返回["selectedTabViewItemIndex"],以便KVO知道您的计算属性在selectedTabViewItemIndex更改时将其视为更改。

(这可能不足以使您已经尝试过的计算属性,因为NSTabViewselectedTabViewItem本身并未记录为kvo-Commiant。)

最新更新