无法以编程方式将字典数组中的行添加到NSTable

时间:2019-08-01 01:40:37

标签: swift cocoa rows nstableview programmatically

我希望能够以编程方式向表中添加行。 从数组添加列标题很容易。 我有一个包含行数据的字典数组 我可以将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
    }


}

没有错误,上面的代码运行。只是需要一种导入行的方法。

2 个答案:

答案 0 :(得分:0)

您使用了错误的表视图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。

答案 1 :(得分:0)

特别感谢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
    }

}