View-Based NSTableView 不显示单元格内容
View-Based NSTableView does not display content of cells
我尝试根据通过应用程序直接上传的数据来显示 table。为此,我使用基于视图的 NSTableView。不知何故,在单元格中,"Table View Cell" 是唯一显示的内容。
我检查了以前的问题,但建议的解决方案对我不起作用。此外,根本没有错误消息。
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 { [=10=].0 }[i], varType: String(describing: contents.columnTypes.map { [=10=].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
}
}
这是故事板 1 的样子。
我建议使用 Cocoa 绑定。它非常高效,您可以摆脱很多代码。
声明您的模型(请以单数形式)
@objcMembers
class VarType: NSObject {
dynamic var varName : String
dynamic var varType : String
}
声明数据源数组
@objc dynamic var variables: [VarType] = []
删除整个viewDidLoad()
方法,整个extension ViewController
和所有出现的self.varsTable.reloadData()
现在是绑定部分。
- 转到 Interface Builder 和 select table 视图(不是滚动视图!)
- 按 ⌥⌘7 到 select 绑定检查器
将 Content
绑定到 View Controller
模型密钥路径 variables
Select 第一列的 NSTextField
。绑定 Value
到 Table Cell View
模型关键路径 objectValue.varName
- Select 第二列的
NSTextField
。将 Value
绑定到 Table Cell View
模型密钥路径 objectValue.varType
运行 应用程序。
我尝试根据通过应用程序直接上传的数据来显示 table。为此,我使用基于视图的 NSTableView。不知何故,在单元格中,"Table View Cell" 是唯一显示的内容。
我检查了以前的问题,但建议的解决方案对我不起作用。此外,根本没有错误消息。
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 { [=10=].0 }[i], varType: String(describing: contents.columnTypes.map { [=10=].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
}
}
这是故事板 1 的样子。
我建议使用 Cocoa 绑定。它非常高效,您可以摆脱很多代码。
声明您的模型(请以单数形式)
@objcMembers class VarType: NSObject { dynamic var varName : String dynamic var varType : String }
声明数据源数组
@objc dynamic var variables: [VarType] = []
删除整个
viewDidLoad()
方法,整个extension ViewController
和所有出现的self.varsTable.reloadData()
现在是绑定部分。
- 转到 Interface Builder 和 select table 视图(不是滚动视图!)
- 按 ⌥⌘7 到 select 绑定检查器
将
Content
绑定到View Controller
模型密钥路径variables
Select 第一列的
NSTextField
。绑定Value
到Table Cell View
模型关键路径objectValue.varName
- Select 第二列的
NSTextField
。将Value
绑定到Table Cell View
模型密钥路径objectValue.varType
运行 应用程序。