首页 > 解决方案 > 从表子类访问 NSTableView 数据源

问题描述

Swift 5、Xcode 11 测试版

我正在一个NSTableView子类上设置一个上下文菜单,以便当用户控制单击表中的一堆行时,我将能够对它们采取行动(比如归档它们)。

我可以让菜单工作,但我不明白如何访问在NSTableView的父视图控制器中定义的数据源。

这是我到目前为止所尝试的:

class ListTable: NSTableView{
  override func validateProposedFirstResponder(_ responder: NSResponder, for event: NSEvent?) -> Bool {
    return true
  }

  override func menu(for event: NSEvent) -> NSMenu? {
    let menu = NSMenu()
    menu.addItem(withTitle: "Archive", action: #selector(archiveTheseEntries), keyEquivalent: "")
    return menu
  }

  @objc func archiveTheseEntries(){
    print(self.selectedRowIndexes) <-- This works

    for row in self.selectedRowIndexes{
      //How do I get access to my datasource? This doesn't seem to work...
      //let entry = self.dataSource?.tableView?(self, objectValueFor: self.tableColumns[0], row: row)
    }

  }
}

我知道我可以NSMenu在情节提要中设置并使用 anIBAction来连接Archive动作,但我希望让这种方法发挥作用。

标签: nstableviewappkitnsmenu

解决方案


我终于弄明白了。如果我引用self.dataSource.self然后我发现它指向定义我的数据源的视图控制器。

@objc func archiveTheseEntries(){

  guard let entryVC = self.dataSource as? EntryVC else{ return }

  var entries = [Entry]()
  for row in self.selectedRowIndexes{
    entries.append(entryVC.entries[row]) <-- entryVC.entries contains my table data
  }
  //...
}

推荐阅读