允许用户在 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.但是除了"你最好实现一个自定义视图"之外,没有提供真正的解决方案——这似乎是很多工作,远远超出了我目前的知识。

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

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

更新:对于可能的重复问题,答案只是一句话,建议NSCollectionView执行任务,但没有提供任何原因。特别是我的任务是呈现"来自非常大的数组的信息,就像电子表格一样"没有得到解决。例如,NSCollectionViewDataSource 协议强制您实现collectionView:numberOfItemsInSection:。但是(本质上是一维的("项目数量"的概念与带有二维数据的电子表格的想法不太吻合。这同样适用于索引路径为您提供the item index within that sectioncollectionView:itemForRepresentedObjectAtIndexPath:。同样,我必须处理二维源的一维索引。

我正在寻找的是一个本机解决方案,用于其他GUI工具包提供的相当简单的网格视图,例如FLTK的Fl_Table或wxWidget的wxGrid。

这是我所知道的。

若要禁用 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的文档以获取有关此内容的更多详细信息。

在您的单元格能够处理传入事件后,可以处理您提到的单元格中的"鼠标句柄代码"。

最新更新