无法以编程方式将字典数组中的行添加到 NSTable
Can't add rows from array of dictionaries to a NSTable programmatically
我希望能够以编程方式向我的 Table 添加行。
从数组中添加列 headers 非常容易。
我有一组包含行数据的字典
我可以将 csv 数据导入此数组。
var rowData = [[String:String]]()
我想将其转储到我的 table 行中。
我错过了什么?
我试过... func numberOfRows() 和 func tableView() 但它们没有像我用 IB
创建 table 时那样的效果
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
}
}
没有错误,以上代码运行。只需要一种导入行的方法。
您使用了错误的 table 视图数据源委托方法。对基于单元格的 table.
使用 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。
特别感谢 El Tomato,
我还有很多东西要学,但下面的代码有效!
我现在可以将任何带有 headers 的旧 CSV 导入 TableView 并将其显示在视图控制器中...
我把 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"
}
我最初是在创建一个 class。因为我大麦明白我在做什么,所以我把所有东西都放进了 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
}
}
我希望能够以编程方式向我的 Table 添加行。 从数组中添加列 headers 非常容易。 我有一组包含行数据的字典 我可以将 csv 数据导入此数组。
var rowData = [[String:String]]()
我想将其转储到我的 table 行中。 我错过了什么?
我试过... func numberOfRows() 和 func tableView() 但它们没有像我用 IB
创建 table 时那样的效果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
}
}
没有错误,以上代码运行。只需要一种导入行的方法。
您使用了错误的 table 视图数据源委托方法。对基于单元格的 table.
使用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。
特别感谢 El Tomato, 我还有很多东西要学,但下面的代码有效! 我现在可以将任何带有 headers 的旧 CSV 导入 TableView 并将其显示在视图控制器中...
我把 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"
}
我最初是在创建一个 class。因为我大麦明白我在做什么,所以我把所有东西都放进了 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
}
}