swift - NSTable中对象的列向数据

标签 swift macos nstableview

我试图用来自对象数组但面向列的信息填充我的 NSTable。默认的表格方向是按行。所以,每个对象的信息都是按行呈现的:

row oriented object data in NSTableView

但我需要按列呈现对象信息:

column oriented object data in NSTableView

我不明白如何实现这一点。如果列数在运行时是可变的,如何显示面向列的对象数据?重用单元格/ 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?

现在,如果您有固定数量的模型对象(因此固定数量的列),这就有效。如果您事先不知道,您可以使用数组字典代替 feat1sfeat2s 等,并使用类似

的内容动态插入新列
tableView.addTableColumn(tableColumn: NSTableColumn)

关于swift - NSTable中对象的列向数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41950764/

相关文章:

swift - NSTableView 显示每一行中的最后一个对象

ios - 重用 UIView 会导致应用卡住

ios - WebRTC(iOS): local video is not getting stream on remote side

linux - Unix(BSD Unix, MacOSX) vs Linux登录setuid位区别

cocoa - 禁用突出显示颜色 NSTableview - Apple 开发

objective-c - 基于 View 的 NSTableView 选择突出显示

ios - 从 com.apple.main-thread 入队(线程 1)崩溃 | iOS | swift 4.1

ios - 如何从这个数组数组中获取我需要的数据?

c - ld : duplicate symbol _dbg_char

c++ - 将终端的 codesign -dvvvv 输出读取到 cpp 程序中