2017-02-25 50 views
0

使用偏好设置窗格。我有一个NSTabView;制表符是从XIB动态创建的。它们都非常相似,但不完全相同。所以,我需要根据当前选择的标签来改变一些值(以及一些控件出现或消失)。Swift/Cocoa:如何将值绑定到当前选定的选项卡

通常人们会认为可以绑定到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() 
} 
+0

尝试用一个可变的appDelegate ... – Ananth

+0

别绑定到视图,绑定到控制器(或文档或应用程序委托)。为什么要隐藏并在隐形标签上显示项目?你不能隐藏一次视图吗? – Willeke

回答

1

您应该能够使用NSTabViewController及其selectedTabViewItemIndex财产,这是专门记录为符合绑定 - 。

如果需要,您可以创建一个计算属性,该属性基于selectedTabViewItemIndex构建,以映射到所选项目的适当模型对象。当您这样做时,请务必执行类别方法keyPathsForValuesAffecting<Key>以返回["selectedTabViewItemIndex"],以便KVO知道只要selectedTabViewItemIndex发生更改就会将您的计算属性更改为已更改。

(这可能是不足以让你已经尝试过的工作计算的属性,因为NSTabViewselectedTabViewItem本身并不记录为符合志愿 - 。)

+0

会试试这个。一个问题,虽然...我不确定如何实现NSTabViewController,并且一直没有找到足够的文档来帮助我。即使我实现了一个空的NSTabViewController子类,我的NSTabView中断了,选项卡也不可选择(每当我尝试更改它们时,我都会崩溃)......这就是为什么我当前的实现使用的是NSViewController的子类,它也符合NSTabViewDelegate。 –

+0

你是如何创建你的选项卡视图,编程或通过IB? –

+0

通过IB创建标签视图本身,并通过mainViewDidLoad()动态添加标签 –

相关问题