Xcode 数组到 NSTableView

Xcode Array to 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:

除了 ViewController.swift 出口外,我目前对此没有任何绑定。

当我执行程序时,TableView 更新了行,但没有使用数组中的值:

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

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

提前致谢!

我通过改变一些东西解决了这个问题。首先,我将 Main.storyboardTable View 的 "Content Mode" 从 "View Based" 更改为 "Cell Based":

这删除了将单元格映射到 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
}

现在这很有用。

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

Cocoa 绑定和基于视图的 table 视图很容易实现。

  • 声明 allPublishersdynamic

    @objc dynamic var allPublishers = [[String: String]]() // however a custom class is highly recommended.
    
  • 在界面生成器中
    • 断开连接datasource
    • 将 table 视图从 Cell Based 更改为 View Based
    • 将 table 视图的 Content 绑定到 ViewController > allPublishers
    • 将第一列Table View CellValue绑定到Table Cell View > objectValue.name
    • 将第二列Table View CellValue绑定到Table Cell View > objectValue.id

请注意细微但重要的区别Table View CellTable Cell View

无需更多代码。