我试图用来自对象数组但面向列的信息填充我的 NSTable
。默认的表格方向是按行。所以,每个对象的信息都是按行呈现的:
但我需要按列呈现对象信息:
我不明白如何实现这一点。如果列数在运行时是可变的,如何显示面向列的对象数据?重用单元格/ View 的标准 NSDataSourceProtocol
在我的情况下没有用:
func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any? {
var text: String = ""
var cellIdentifier: String = ""
guard let item = modelObjectArray?[row] else {
return nil
}
if tableColumn == tableView.tableColumns[0] {
let text = item.name
cellIdentifier = "someIdentifier"
} else if ...{
...
}
if let cell = tableView.make(withIdentifier: cellIdentifier, owner: nil) as? NSTableCellView {
cell.textField?.stringValue = text
return cell
}
return nil
}
有什么想法吗?
谢谢!
最佳答案
我同意评论说你最好选择不同的架构(UICollectionView
确实是最好的选择)但是为了好玩让我们尝试实现你的原始请求。
我做了很多假设来简化代码(比如所有功能都是字符串),所以如果你想这样做,你应该适应你的实现细节。
因此,首先让我们为您的表创建正确的模型(在您的 viewDidLoad
方法或类似方法中的某处):
var feat1s = [String]()
var feat2s = [String]()
var feat3s = [String]()
for modelObject in modelObjects {
feat1s.append(modelObject.feat1)
feat2s.append(modelObject.feat2)
feat3s.append(modelObject.feat3)
}
然后,确保为每个行/列组合返回正确的对象:
func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any? {
let colIndex = tableView.tableColumns.index(of: tableColumn!)!
switch row {
case 0: return feat1s[colIndex]
case 1: return feat2s[colIndex]
case 2: return feat3s[colIndex]
default: return nil
}
}
请注意,我们的数据源方法返回的是 String 对象,而不是 NSTableCellView
。在 Interface Builder 中使用绑定(bind)将返回的对象“链接”到单元格 View 模板中的字段会更容易。
如果你绝对想返回完全格式化的 NSTableCellView
我宁愿使用其他数据源方法:
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView?
现在,如果您有固定数量的模型对象(因此固定数量的列),这就有效。如果您事先不知道,您可以使用数组字典代替 feat1s
、feat2s
等,并使用类似
tableView.addTableColumn(tableColumn: NSTableColumn)
关于swift - NSTable中对象的列向数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41950764/