【问题标题】:Can't add rows from array of dictionaries to a NSTable programmatically无法以编程方式将字典数组中的行添加到 NSTable
【发布时间】: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
    }


}

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

【问题讨论】:

  • 你没有使用NSTableViewDataSource委托方法来显示表格行。
  • 不确定您的意思?我试过这个func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -&gt; 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) -&gt; 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() }。另外,我已经更新了上面的代码......仍然无法填充行

标签: swift cocoa rows nstableview programmatically


【解决方案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
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-01
      • 1970-01-01
      • 2022-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多