无法以编程方式将字典数组中的行添加到 NSTable
Posted
技术标签:
【中文标题】无法以编程方式将字典数组中的行添加到 NSTable【英文标题】:Can't add rows from array of dictionaries to a NSTable programmatically 【发布时间】:2019-08-01 01:40:37 【问题描述】:我希望能够以编程方式将行添加到我的表中。 从数组中添加列标题很容易。 我有一个包含行数据的字典数组 我可以将 csv 数据导入到这个数组中。
var rowData = [[String:String]]()
我想将其转储到我的表格行中。 我错过了什么?
我已经尝试过... func numberOfRows() 和 func tableView() 但它们没有像我使用 IB 创建表时那样的效果
import Foundation
import Cocoa
class TableView:NSObject
var tableContainer = NSScrollView.init(frame: NSRect(x:0, y: 0, width: 800, height: 200))
var tableView:NSTableView = NSTableView(frame: NSRect(x:0, y: 0, width: 800, height: 200))
func populateHeaders()
for x in 0..<headers.count
let column = NSTableColumn.init(identifier:NSUserInterfaceItemIdentifier(rawValue: headers[x]))
tableView.addTableColumn(column)
column.headerCell = NSTableHeaderCell(textCell: headers[x])
override init ()
super.init()
populateHeaders()
self.tableView.delegate = self
self.tableView.dataSource = self
tableView.reloadData()
tableContainer.documentView = tableView
tableContainer.hasVerticalScroller = true
extension TableView: NSTableViewDelegate, NSTableViewDataSource
func numberOfRows(in tableView: NSTableView) -> Int
return csvArray.count
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView?
var result:NSTableCellView
result = tableView.makeView(withIdentifier: (tableColumn?.identifier)!, owner: self) as! NSTableCellView
result.textField?.stringValue = csvArray[row][(tableColumn?.identifier.rawValue)!]!
print("hi")
return result
func tableView(_ tableView: NSTableView, shouldSelectRow row: Int) -> Bool
return true
没有错误,上面的代码运行。只需要一种导入行的方法。
【问题讨论】:
你没有使用NSTableView
的DataSource
委托方法来显示表格行。
不确定您的意思?我试过这个func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? var result:NSTableCellView result = tableViewView.makeView(withIdentifier: (tableColumn?.identifier)!, owner: self) as! NSTableCellView result.textField?.stringValue = csvArray[row][(tableColumn?.identifier.rawValue)!]! return result
它没有填充行!
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView?
是为了什么!?基于单元格还是基于视图的表格视图单元格?
Cell-Based 我正在使用 ViewController 上的提交按钮来更新数据,这可能是个问题...@IBAction func submitBtn(_ sender: NSButton) importBtnObj.isHidden = false csv.csvToList() self.view.addSubview(TableView().tableContainer) submitBtnObj.isHidden = true TableView().tableView.reloadData()
。另外,我已经更新了上面的代码......仍然无法填充行
【参考方案1】:
您使用了错误的表视图 DataSource 委托方法。对基于单元格的表格使用tableView(_:objectValueFor:row:)
委托方法。
func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any?
let dict = csvArray[row]
if ((tableColumn?.identifier)!.rawValue == "firstColumn")
return dict["whatever"]
else if ((tableColumn?.identifier)!.rawValue == "secondColumn")
return dict["whatever"]
...
...
我不知道确切的列 ID。为身份检查器下的每一列输入一个 ID。
【讨论】:
【参考方案2】:特别感谢 El Tomato, 我还有很多东西要学,但下面的代码有效! 我现在可以将任何带有标题的旧 CSV 导入 TableView 并在 View Controller 中显示...
我把 El Tomato 的回答改成了这样......
func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any?
let dict = csvArray[row]
print(dict[headers[1]])
for x in 0..<headers.count
if ((tableColumn?.identifier)!.rawValue == headers[x])
print(dict[headers[x]])
return dict[headers[x]]
return "nil"
我最初是在创建一个类。因为我大麦了解我正在做的事情,所以我将所有内容都放入 ViewController.swift 中。现在我已经弄清楚了,我可以尝试重构。下面的工作代码!
import Cocoa
var csvArray = [[String:String]]()
var headers = [String]()
var globalPathToCsv:NSURL!
var csv = CSVaccessability()
class ViewController: NSViewController, NSTableViewDelegate, NSTableViewDataSource
var tableContainer = NSScrollView.init(frame: NSRect(x:0, y: 0, width: 800, height: 200))
var tableView:NSTableView = NSTableView(frame: NSRect(x:0, y: 0, width: 800, height: 200))
func populateHeaders()
for x in 0..<headers.count
let column = NSTableColumn.init(identifier:NSUserInterfaceItemIdentifier(rawValue: headers[x]))
tableView.addTableColumn(column)
column.headerCell = NSTableHeaderCell(textCell: headers[x])
func setup ()
tableView.delegate = self
tableView.dataSource = self
tableView.reloadData()
tableContainer.documentView = tableView
tableContainer.hasVerticalScroller = true
@IBOutlet weak var submitBtnObj: NSButton!
@IBOutlet weak var importBtnObj: NSButton!
@IBAction func submitBtn(_ sender: NSButton)
importBtnObj.isHidden = false
csv.csvToList()
self.view.addSubview(tableContainer)
submitBtnObj.isHidden = true
setup()
populateHeaders()
@IBAction func importBtn(_ sender: Any)
let openPanel = NSOpenPanel()
openPanel.allowsMultipleSelection = false
openPanel.canChooseDirectories = false
openPanel.canCreateDirectories = false
openPanel.canChooseFiles = true
openPanel.allowedFileTypes = ["csv"]
openPanel.begin (result) in
if result == NSApplication.ModalResponse.OK
globalPathToCsv = openPanel.url! as NSURL
submitBtnObj.isHidden = false
importBtnObj.isHidden = true
override func viewDidLoad()
super.viewDidLoad()
submitBtnObj.isHidden = true
// Do any additional setup after loading the view.
override var representedObject: Any?
didSet
// Update the view, if already loaded.
func numberOfRows(in tableView: NSTableView) -> Int
return csvArray.count
func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any?
let dict = csvArray[row]
print(dict[headers[1]])
for x in 0..<headers.count
if ((tableColumn?.identifier)!.rawValue == headers[x])
print(dict[headers[x]])
return dict[headers[x]]
return "nil"
func tableView(_ tableView: NSTableView, shouldSelectRow row: Int) -> Bool
return true
【讨论】:
以上是关于无法以编程方式将字典数组中的行添加到 NSTable的主要内容,如果未能解决你的问题,请参考以下文章
如何在 iPhone 中以编程方式在 plist 文件中添加多个数组