OS X开发.第一章,1.17, NSTabView

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界面

Guess you like

Origin blog.csdn.net/kicinio/article/details/120926917