一个View Controller上有多个NSTableView

时间:2015-05-25 15:06:13

标签: swift nstableview

我想在一个ViewController上有多个NSTableView。我使用以下代码实现了第一个TableView:

class MainViewController: NSViewController
{

    @IBOutlet weak var tableView: NSTableView!

    override func viewDidLoad() 
    {
        super.viewDidLoad()

        let nib = NSNib(nibNamed: "MyCellView", bundle: NSBundle.mainBundle())
        tableView.registerNib(nib!, forIdentifier: "MyCellView")

        let appDelegate = NSApplication.sharedApplication().delegate as! AppDelegate
        appDelegate.view = self
    }
}

extension MainViewController: NSTableViewDataSource, NSTableViewDelegate 
{
    func numberOfRowsInTableView(tableView: NSTableView) -> Int 
    {
        return 5
    }

    func tableView(tableView: NSTableView, heightOfRow row: Int) -> CGFloat
    {
        return 25
    }

    func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView? 
    {
        let cell = tableView.makeViewWithIdentifier("MyCellView", owner: self) as! MyCellView

        cell.itemName.stringValue = "row text"
        return cell
    }
}

这个NSTableView运行正常,但它显然与视图控制器紧密相关。添加第二个NSTableView的最佳方法是什么?

2 个答案:

答案 0 :(得分:6)

终于找到了如何做到这一点。在我看来,这比将NSTableView放在主控制器中要好得多。

每个表都有自己的类:

Class<? extends Object>

表2是相同的,但显然可以有不同的数据等。

我的表是基于视图的,所以这里是单元格视图类定义:

import Cocoa

class Table1: NSTableView, NSTableViewDataSource, NSTableViewDelegate
{

    override func drawRect(dirtyRect: NSRect)
    {
        super.drawRect(dirtyRect)
    }

    func numberOfRowsInTableView(tableView: NSTableView) -> Int
    {
        return 10
    }

    func tableView(tableView: NSTableView, heightOfRow row: Int) -> CGFloat
    {
        return 50
    }

    func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView?
    {
        let cell = tableView.makeViewWithIdentifier("MyCellView", owner: self)  as! MyCellView!

        cell.itemName.stringValue = "hello"
        cell.itemDescription.stringValue = "This is some more text"

        return cell
    }
}

以下是View Controller方法:

import Cocoa

class MyCellView: NSTableCellView
{
     @IBOutlet weak var itemName: NSTextField!
     @IBOutlet weak var itemDescription: NSTextField!
}

答案 1 :(得分:1)

这取决于你对“最佳”的意思。最简单的方法是根据回调中的tableView参数进行推理,即

func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView? 
{
    if(tableView == self.tableView1)
    {
    }
    else if(tableView == self.tableView2)
    {
    }
}

但是我建议创建单独的类来用作数据源。这些类将实现UITableViewDataSource协议。您可以创建该类的两个实例,并相应地绑定表视图。