我尝试根据直接通过应用程序上传的数据显示表格。为此,我使用基于 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 路径变量
选择第一列的
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/