我试图在基于视图的NSTableView中显示非常基本的数据结构。经过几个小时的搜索,我终于得到了大部分桌子的设置点。行数是正确的,我知道func tableView(tableView: NSTableView, objectValueForTableColumn tableColumn: NSTableColumn?, row: Int)
方法为所有单元执行,因为它在控制台中输出正确的数据。不幸的是,表格显示的是默认值,而不是我的数据数组中的String
。在Swift中基于视图的NSTableView不显示内容
下面的代码:
ViewController.swift
import Cocoa
class ViewController: NSViewController {
@IBOutlet weak var myTableView: NSTableView!
var files = [FilesListData]()
override func viewDidLoad() {
super.viewDidLoad()
self.setupSampleFiles()
}
override func viewDidAppear() {
super.viewDidAppear()
}
func setupSampleFiles() {
let file1 = FilesListData(file: "test.mp3", title: "test")
let file2 = FilesListData(file: "test2.mp3", title: "test 2")
self.files = [file1, file2]
}
}
extension ViewController: NSTableViewDataSource {
func numberOfRowsInTableView(tableView: NSTableView) -> Int {
return self.files.count
}
func tableView(tableView: NSTableView, objectValueForTableColumn tableColumn: NSTableColumn?, row: Int) -> AnyObject? {
let cellView: NSTableCellView = tableView.makeViewWithIdentifier((tableColumn!.identifier), owner: self) as! NSTableCellView
let fileData = self.files[row]
if tableColumn!.identifier == "fileCol" {
cellView.textField!.stringValue = fileData.file
} else if tableColumn!.identifier == "titleCol" {
cellView.textField!.stringValue = fileData.title
} else {
cellView.textField!.stringValue = "N/A"
}
return cellView
}
}
extension ViewController: NSTableViewDelegate {
}
FilesListData.swift
import Foundation
class FilesListData: NSObject {
var file: String
var title: String
override init() {
self.file = String()
self.title = String()
}
init(file: String, title: String) {
self.file = file
self.title = title
}
}
一些更多的注意事项:在故事板,我也创建dataSource
和的插座3210添加到View Controller。我的前两列的标识符被设置为“fileCol”和“titleCol”。该项目编译并运行时没有任何错误或警告。以下是我的故事板的几个截图。
你好肯和谢谢你的彻底答案。我想保留'NSTableCellView's,因为正如你所提到的那样,我将能够在后面扩展表格的复杂性。我能够通过实现'tableView(_:viewForTableColumn:row:)'成功显示数据。然而,绑定方法似乎很有趣,但我不知道如何实现这一点。你提到的“价值”就是'委托'出口? N.B .:我没有提到的一件事是我的'NSTableCellView'的'textField'有一个到它的子节点'NSTextField'的插座。 – beeb
设置绑定的最简单方法是在IB中。选择文本字段后,选择视图>实用程序>显示绑定检查器。切换打开值绑定。对于“绑定到”弹出窗口,请选择表格单元格视图。对于模型关键路径输入'objectValue.file'或类似的东西。 (Xcode会显示一个感叹号图标,因为它无法验证关键路径是否有效,但是您可以忽略它。这是系统的动态性质,因为它无法知道'objectValue'类型是什么类型。) –
精彩,这就像一个魅力!再次感谢 – beeb