swift - 基于 View 的 NSTableView 不显示单元格内容

标签 swift macos cocoa

我尝试根据直接通过应用程序上传的数据显示表格。为此,我使用基于 View 的 NSTableView。不知何故,在单元格中,“ TableView 单元格”是唯一显示的内容。

我检查了之前的问题,但建议的解决方案对我不起作用。此外,根本没有错误消息。

使用Swift 5,Cocoa应用程序适用于MacOS。

import Cocoa
import CreateML
import Foundation

class ViewController: NSViewController {

    @IBOutlet weak var varsTable: NSTableView!

    var variables: [VarTypes] = []

    @IBAction func uploadButton(_ sender: Any) {
        let dialog = NSOpenPanel();

        dialog.title                   = "Choose a .csv file";
        dialog.showsResizeIndicator    = true;
        dialog.showsHiddenFiles        = false;
        dialog.canChooseDirectories    = true;
        dialog.canCreateDirectories    = true;
        dialog.allowsMultipleSelection = false;
        dialog.allowedFileTypes        = ["csv"];

        if (dialog.runModal() == NSApplication.ModalResponse.OK) {
            let result = dialog.url

            if let path = result?.absoluteURL {
                do {
                    let contents = try MLDataTable(contentsOf: path)

                    for i in 0..<contents.columnNames.count {
                        variables.append(VarTypes.init(varName: contents.columnTypes.map { $0.0 }[i], varType: String(describing: contents.columnTypes.map { $0.1 }[i])))
                    }

                    self.varsTable.reloadData()


                } catch {
                }
            } else {
                // the URL was bad!
            }
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        varsTable.delegate = self
        varsTable.dataSource = self
        self.varsTable.reloadData()
    }
}

extension ViewController: NSTableViewDataSource, NSTableViewDelegate {

    func numberOfRows(in varsTable: NSTableView) -> Int {
        return (variables.count)
    }

    func varsTable(_ varsTable: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {

        let varType = variables[row]

        guard let cell = varsTable.makeView(withIdentifier: tableColumn!.identifier, owner: self) as? NSTableCellView else { return nil }

        if (tableColumn?.identifier)!.rawValue == "varName" {
            cell.textField?.stringValue = varType.varName
        } else {
            cell.textField?.stringValue = varType.varType
        }

        return cell
    }

}

Storyboard是这样的 1好像。

最佳答案

我建议使用 Cocoa Bindings。它非常高效,并且您可以消除大量代码。

  • 声明您的模型(请采用单数形式)

    @objcMembers
    class VarType: NSObject {
    
        dynamic var varName : String
        dynamic var varType : String
    }
    
  • 声明数据源数组

    @objc dynamic var variables: [VarType] = []
    
  • 删除整个 viewDidLoad() 方法、整个扩展 ViewController 以及所有出现的 self.varsTable.reloadData()

现在绑定(bind)部分出现了。

  • 转到 Interface Builder 并选择表格 View (而不是 ScrollView !)
  • ⌥⌘7 选择绑定(bind)检查器
  • 内容绑定(bind)到 View Controller 模型 key 路径 变量

    enter image description here

  • 选择第一列的 NSTextField。将 Value 绑定(bind)到 Table Cell View 模型键路径 objectValue.varName

  • 选择第二列的 NSTextField。将 Value 绑定(bind)到 Table Cell View 模型键路径 objectValue.varType

运行应用程序。

关于swift - 基于 View 的 NSTableView 不显示单元格内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56882980/

相关文章:

swift - 如何使用 Swift 将游戏的高分保存在排行榜上?

swift - 为什么我会收到错误 “Protocol … can only be used as a generic constraint because it has Self or associated type requirements” ?

swift - 如何在 Swift 中计算当前时间和设定时间之间的时差

c - 知道为什么这段代码没有并行运行

macos - 以编程方式检索 OSX 网络/代理配置值

ios - 为什么我们要在AppDelegate中完全自定义UINavigationBar的barTintColor?

objective-c - NSMenuItem 中的自定义 View 禁用 NSPopUpButton 选择

objective-c - 如何比较/Users/john 格式的 URL 和文件 ://localhost/Users/etc 中的 URL

objective-c - 调整 NSCollectionViewItem View 的大小

macos - OpenAL 在 Mac OS X 上支持 5.1 输出吗?