Swift - 数组到 macOS 中的 TableView

Swift - Array to TableView in macOS

我有一些数据来自 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 outlet,它的列的标识符与上面的字典相关:

@IBOutlet var voucherTableView: NSTableView!

一旦我 运行 我的控制器中的 voucherTableView.reloadData(); 代码 table 填充了正确数量的行,但列中的数据完全相同:

这是我的 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
    }

有没有人知道如何通过重新加载命令将数据从我的数组获取到 table视图?

我建议使用 Cocoa 绑定

  • 将 Interface Builder 中 table 视图的 datasource 连接到目标 class
  • 实现这两个方法(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] 例如

注意:强烈建议将字典映射到自定义 class(必须从 NSObject 继承 class

如果您将列标识符设置为与字典中的键相匹配,您应该可以这样做:

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
}