1.17 NSTabView
NSTabView是Cocoa中提供的用以管理一组子容器的容器,其作用类似于Swing中的JTabbedPane,在有限的空间内可展示或管理更多的子容器。
1.17.1 基本声明
class WidgetController: NSViewController, NSTabViewDelegate {
var mView: NSView!
var tabView: NSTabView!
override func loadView() {
self.view = NSView(frame: NSRect(x: 0, y: 0, width: 800, height: 500))
}
private func initView10(){
mView = NSView(frame: NSRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height))
tabView = NSTabView(frame: NSRect(x: 100, y: 100, width: 500, height: 300))
tabView.delegate = self
// tabView.addTabViewItem(NSTabViewItem(viewController: SearchFieldController()))
// tabView.addTabViewItem(NSTabViewItem(viewController: CollectionViewController()))
let searchVC = SearchFieldController()
let collectionVC = CollectionViewController()
let searchItem = NSTabViewItem(viewController: searchVC)
let collectionItem = NSTabViewItem(viewController: collectionVC)
searchItem.label = "Search"
collectionItem.label = "Collection"
tabView.addTabViewItem(searchItem)
tabView.addTabViewItem(collectionItem)
tabView.selectTabViewItem(at: 1)
self.view.addSubview(tabView)
}
private func initConfig(){
self.title = "NSWidget-Family"
}
override func viewDidLoad() {
super.viewDidLoad()
// Do view setup here.
initView10()
initConfig()
}
func tabView(_ tabView: NSTabView, didSelect tabViewItem: NSTabViewItem?) {
print("------> didSelect\(tabViewItem?.viewController)")
}
}
说明:由于NSTabView管理者子容器,所以我们需要提前准备两个NSViewController(这里用以演示的是之前编写的SearchFieldViewController与CollectionViewController)。注释地方是直接用匿名类进行添加子项的。这种方式虽然简介,但是NSTabView的表头是直接显示类名的,不太符合业务场景,因此可采用注释下面略显繁琐的方式一步步进行实例化添加。addTabViewItem() 方法不仅可用于初始化时添加子容器,也可用于动态添加。
在类名后实现NSTabViewDelegate可用于设置选中回调代理,在知晓具体点击哪个子容器后进行操作。需要指出的是,子容器内的代理方法与NSTabView对象所处的NSViewController内代理并不冲突,但要注意tag不能混淆。
运行图
图1 - 通过selectTabViewItem(at:)进行初始化的界面
图2 - 选中Search界面