如何从NIB创建自定义NSTableCellView?

时间:2018-12-20 12:09:05

标签: swift macos nstableview appkit

我是Swift的新手,我正在与NSTableView苦苦挣扎!我正在尝试从NIB创建自定义NSTableCellView。

我想从NIB加载单元,因为: -将在多列和多表视图中重用 -外观和功能(相对)复杂 -在开发过程中可能会进化

我能够在表格视图中加载单元格,但是当我尝试用数据填充视图时,在调试区域中出现“无法从...缺少出口的设置器或实例变量连接插座”错误。自定义单元格在表格视图中可见,但似乎未实例化。

我已经在线搜索了一个小时的解决方案!帮我丢失什么?

这是我的TableViewController ...

protocol TableViewDelegate {
    func itemWithIndexWasSelected(value: Int)
}

class TableViewController: NSViewController {

    @IBOutlet weak var tableView: NSTableView!

    let tableViewData =
        [  [ "Column1": "John", "Column2": "Smith", "Hobby": "Birds"],
           [ "Column1": "Jane", "Column2": "Doe", "Hobby": "Fish"],
           [ "Column1": "Hal", "Column2": "Bernard", "Hobby": "Trees"],
           [ "Column1": "Harry", "Column2": "Bell", "Hobby": "Rocks"] ]


    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.delegate = self
        tableView.dataSource = self

        let customCellNib = NSNib.init(nibNamed: "CustomTableCellView", bundle: nil)
        tableView.register(customCellNib, forIdentifier: NSUserInterfaceItemIdentifier("CustomCellView"))
        tableView.reloadData()
    } 
}

extension TableViewController: NSTableViewDataSource, NSTableViewDelegate {

    func numberOfRows(in tableView: NSTableView) -> Int {
        return tableViewData.count
    }

    func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {

        if tableColumn?.identifier.rawValue == "CustomCell" { 
            let result: CustomTableCellView = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier("CustomCellView"), owner: self) as! CustomTableCellView

            result.hobbyLabel?.stringValue = tableViewData[row]["Hobby"]!
            result.hobbyButton?.title = "TESTTITLE"

            return result
        }

        else {
            let result = tableView.makeView(withIdentifier:(tableColumn?.identifier)!, owner: self) as! NSTableCellView
            result.textField?.stringValue = tableViewData[row][(tableColumn?.identifier.rawValue)!]!
        return result
        }
    } 
}

我有一个具有同名XIB的CustomTableCellView ...

class CustomTableCellView: NSTableCellView {

    @IBOutlet weak var hobbyButton: NSButton!
    @IBOutlet weak var hobbyLabel: NSTextField!

}

我有一个可以发送或上传的测试项目...非常感谢您的帮助!

This is what I am seeing. I thought I was close... hours ago!

1 个答案:

答案 0 :(得分:0)

编辑xib时,文件的所有者代理对象表示在运行时作为所有者传递给makeView(withIdentifier:owner:)的对象。在这种情况下,所有者对象是视图控制器。您可以在xib中将文件所有者的类设置为TableViewController并连接操作。您无法将文件所有者的类别设置为CustomTableCellView并连接插座。而是连接CustomTableCellView视图对象的出口。