Xcode数组到NSTableView

时间:2018-03-01 12:59:39

标签: swift xcode macos nstableview

我做了一些搜索,一些编码,一些搜索,然后再编码。我只是不能让它自己工作。我想从我定义的数组中获取数据:

var allPublishers = [[String: String]]()

我将从外部API调用中填充数组。我可以每100个块调用一次刷新。这是人口:

for i in 0 ..< json["publishers"].count {
    let pname: String = String(describing: json["publishers"][i]["publisher"]["account_name"])
    let pid: String = String(describing: json["publishers"][i]["publisher"]["publisher_id"])
    self.allPublishers.append(["name": pname, "id": pid])
}

例如,在前100后我调用此函数:

self.showPublishers()

现在只显示类型,用于以下目的:

func showPublishers(){
    DispatchQueue.main.async {
        self.tableView.reloadData()
    }
}

类型为:Array<Dictionary<String, String>>

部分填充的块的样本是:

[["id": "1100l6141", "name": "014loyalia"], ["id": "1101l11949", "name": "030magazin"]]

我有一个NSTableView设置的插座:

@IBOutlet weak var tableView: NSTableView!

我的Main.storyboard

NSTableView

除了ViewController.swift插座之外,我还没有这方面的约束。

当我执行程序时,TableView会更新行,但不会更新数组中的值:

Rows

以下是我的tableView功能:

extension ViewController:NSTableViewDataSource{
    func numberOfRows(in tableView: NSTableView) -> Int {
        return allPublishers.count
    }

    func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any? {
        return allPublishers[row][(tableColumn?.identifier.rawValue)!]
    }
}

有人可以建议如何使用NSTableView的实际数据填充此allPublishers吗?

提前致谢!

2 个答案:

答案 0 :(得分:2)

强烈建议您不要使用基于单元格的表格视图。

Cocoa Bindings和基于视图的表视图非常容易实现。

  • allPublishers声明为dynamic

    @objc dynamic var allPublishers = [[String: String]]() // however a custom class is highly recommended.
    
  • 在Interface Builder中
    • 断开datasource
    • 将表格视图从Cell Based更改为View Based
    • 将表格视图的Content绑定到ViewController > allPublishers
    • 将第一列Value的{​​{1}}绑定到Table View Cell
    • 将第二列Table Cell View > objectValue.name的{​​{1}}绑定到Value

请注意表视图单元格表单元格视图

的微妙但重要的区别

无需进一步的代码。

答案 1 :(得分:0)

我通过改变一些事情来解决这个问题。首先,我更改了内容模式&#34; Table View中的Main.storyboard来自&#34;基于视图&#34; to&#34; Cell Based&#34;:

Content Mode

这消除了将单元格映射到UI中的参数的要求。然后,我更改了调用列的ViewController.swift函数:

func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any? {
    if tableColumn == tableView.tableColumns[0] {
        return allPublishers[row]["name"]!
    } else if tableColumn == tableView.tableColumns[1] {
        return allPublishers[row]["id"]!
    }

    return nil
}

这就像魅力一样。