Swift/Cocoa: 如何将值绑定到当前选中的选项卡
Swift/Cocoa: How to bind a value to currently selected tab
正在处理首选项面板。我有一个 NSTabView;选项卡是从 XIB 动态创建的。它们都非常相似,但不完全相同。因此,我需要根据当前选择的选项卡更改一些值(以及一些控件出现或消失)。
通常人们会认为可以绑定到 NSTabView.selectedTabViewItem;但这不起作用。为什么?该值永远不会更新。
然后我变得更有创意,并想到计算 属性 returns 绑定观察的适当值。仍然没有骰子。绑定会在应用程序启动时进行评估,并且永远不会更新。
然后我决定弄乱并创建一个委托来实现 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
之上的计算 属性,以映射到所选项目的适当模型对象。当你这样做时,一定要将 class 方法 keyPathsForValuesAffecting<Key>
实现到 return ["selectedTabViewItemIndex"]
以便 KVO 知道每当 selectedTabViewItemIndex
变化。
(这可能不足以使您已经尝试过的计算 属性 工作,因为 NSTabView
的 selectedTabViewItem
本身没有被记录为符合 KVO。)
正在处理首选项面板。我有一个 NSTabView;选项卡是从 XIB 动态创建的。它们都非常相似,但不完全相同。因此,我需要根据当前选择的选项卡更改一些值(以及一些控件出现或消失)。
通常人们会认为可以绑定到 NSTabView.selectedTabViewItem;但这不起作用。为什么?该值永远不会更新。
然后我变得更有创意,并想到计算 属性 returns 绑定观察的适当值。仍然没有骰子。绑定会在应用程序启动时进行评估,并且永远不会更新。
然后我决定弄乱并创建一个委托来实现 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
之上的计算 属性,以映射到所选项目的适当模型对象。当你这样做时,一定要将 class 方法 keyPathsForValuesAffecting<Key>
实现到 return ["selectedTabViewItemIndex"]
以便 KVO 知道每当 selectedTabViewItemIndex
变化。
(这可能不足以使您已经尝试过的计算 属性 工作,因为 NSTabView
的 selectedTabViewItem
本身没有被记录为符合 KVO。)