让用户在NSTableView

时间:2018-06-08 14:02:33

标签: swift macos nstableview

我正在使用Swift编写一个使用NSTableView作为其主界面的应用程序。该应用程序提供来自非常大的数组的信息,就像电子表格一样。如何让用户从NSTableView中选择一个单元?

我已阅读https://stackoverflow.com/a/20807563/2771733,其中说明: It sounds like you're trying to make a spreadsheet. That's not what a table view is. 但除了&#34之外,没有提供真正的解决方案;您最好实现自定义视图" - 这似乎是很多工作,超出了我目前的知识。

我遇到的一个想法是禁用选择并提供我自己的鼠标处理程序,但我无法关闭选择。即使取消选中表视图的“属性”检查器的“选择”部分中的所有框,用户仍可以选择(突出显示)一行。这会干扰我自己的鼠标处理代码。

那么,有没有办法(ab)使用NSTableView作为电子表格?或者任何其他提示我如何让用户只选择一个单元而不是整行?

更新: possible duplicate question的答案只是推荐NSCollectionView执行任务的单句,但没有说明原因。特别是我的任务是从一个非常大的数组中提供信息,就像电子表格一样#34;没有得到解决。例如,NSCollectionViewDataSource协议强制您实现collectionView:numberOfItemsInSection:。但是(固有的一维)"项目数量的概念"不符合电子表格及其二维数据的想法。对于collectionView:itemForRepresentedObjectAtIndexPath:,索引路径为您提供the item index within that section也是如此。我必须再次处理二维源的一维索引。

我正在寻找的是相当简单的网格视图的原生解决方案,其他GUI工具包提供了像FLTK Fl_Table或wxWidget wxGrid

1 个答案:

答案 0 :(得分:1)

这是我所知道的。

要禁用NSTableView行选择,请在NSTableViewDelegate中使用以下两种方法之一:

optional func tableView(_ tableView: NSTableView, selectionIndexesForProposedSelection proposedSelectionIndexes: IndexSet) -> IndexSet
optional func tableView(_ tableView: NSTableView, shouldSelectRow row: Int) -> Bool

要仅选择单个单元格,您可以继承NSTableView并覆盖

func validateProposedFirstResponder(_ responder: NSResponder, for event: NSEvent?) -> Bool

确定表中的哪个视图或控件需要响应传入的事件。您可以阅读Apple's doc了解更多详情。

在您的单元格能够处理传入的事件后,“鼠标处理代码”会被处理掉。你提到的细胞可以处理。