Swift - macOS中的TableView数组

时间:2017-07-06 15:59:40

标签: swift macos nstableview

我有一些JSON文件的数据,我已将其转换为:

var tempArray = [NSDictionary]()

以下是此数据的示例:

(
    {
        active = y;
        "campaign_id" = "Sample ID 1";
        description = "Sample Text";
        "end_date_time" = "2017-10-01 00:00:00";
        "on_expiry" = ignore;
        "on_invalid_user" = reject;
        "start_date_time" = "2017-07-01 00:00:00";
        "voucher_code" = SAMPLEON1;
        "voucher_code_id" = "Sample ID 4";
    },
    {
        active = y;
        "campaign_id" = "Sample ID 2";
        description = "Sample Text";
        "end_date_time" = "2017-10-01 00:00:00";
        "on_expiry" = ignore;
        "on_invalid_user" = reject;
        "start_date_time" = "2017-06-02 00:00:00";
        "voucher_code" = SAMPLEOFF1;
        "voucher_code_id" = "Sample ID 5";
    }
)

我设置了NSTableView插座,它的列标识相对于上面的字典:

@IBOutlet var voucherTableView: NSTableView!

在我的Controller中运行voucherTableView.reloadData();代码后,表格会填充适量的行,但列中的数据完全相同:

After reloadData

这是我的tableView功能:

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



        let cellView = voucherTableView.make(withIdentifier: "cell", owner: self) as! NSTableCellView

        cellView.textField!.stringValue = self.values.object(at: row) as! String

        return cellView
    }

有没有人知道如何将数据从我的Array中获取到reload命令的tableView中?

2 个答案:

答案 0 :(得分:1)

我建议使用Cocoa Bindings

  • 将Interface Builder中表视图的datasource连接到目标类
  • 实施这两种方法(不需要viewForColumn:row

    func numberOfRows(in tableView: NSTableView) -> Int
    {
        return tempArray.count
    }
    
    func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any?
    {
       return tempArray[row]
    }
    
  • 在Interface Builder Bindings中,Inspector将文本字段的value绑定到Table Cell View > objectValue.[property],例如

    enter image description here

注意:强烈建议将字典映射到自定义类(从class继承NSObject是强制性的)

答案 1 :(得分:0)

如果您将列标识符设置为与字典中的键匹配,则应该能够执行此操作:

private func tableView(tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
    let cellView = voucherTableView.make(withIdentifier: "cell", owner: self) as! NSTableCellView

    cellView.textField!.stringValue = tempArray[row][tableColumn.identifier] as! String

    return cellView
}