Macos NSTableView:选择不可编辑的单元格而不是行

Macos NSTableView:选择不可编辑的单元格而不是行,macos,cocoa,nstableview,appkit,nstextfieldcell,Macos,Cocoa,Nstableview,Appkit,Nstextfieldcell,我已经尝试了其他帖子中的多种建议选项组合,但我似乎无法使用填充了不可编辑的NSTextFieldCell的基于单元格的NSTableView来选择单元格而不是行 我试过: [[col dataCell] setEditable:NO]; [[col dataCell] setSelectable:YES]; [col setEditable:YES]; 代表们: - (BOOL)tableView:(NSTableView *)aTableView shouldSel

我已经尝试了其他帖子中的多种建议选项组合,但我似乎无法使用填充了不可编辑的NSTextFieldCell的基于单元格的NSTableView来选择单元格而不是行

我试过:

    [[col dataCell] setEditable:NO];
    [[col dataCell] setSelectable:YES];

    [col setEditable:YES];
代表们:

- (BOOL)tableView:(NSTableView *)aTableView shouldSelectRow:(NSInteger)rowIndex;

允许选择单元格(而不编辑文本)的原因是我允许用户双击单元格以执行导航功能。双击效果很好,但是用户应该能够看到单击一次(甚至第一次单击)就可以选择单元格。但我得到的只是选择的行,即使委托禁止,也不会选择单元格

这样做的唯一方法是强制单元格在选择高光颜色中绘制其背景吗?(似乎有点粗俗)

顺便说一句,也允许选择列。这目前起作用

有没有人有过这方面的经验?还是一些明智的猜测


斯蒂芬

听起来你好像在尝试制作电子表格。表视图不是这样的

表视图是一个项目列表,每行一个,显示每个项目的一个或多个方面,每列一个

在这种情况下,仅选择但不编辑单个项目的一个属性几乎没有意义。它可能有一些使用案例(例如,可以方便地在iTunes中仅选择和复制曲目的标题),但它不是NSTableView和NSOutlineView所能适应的

电子表格是非常不同的东西。每个细胞都是彼此对等的;两个轴都不一定从属于另一个轴。电子表格可以用作表格(例如:项目、价格、数量、小计),但不绑定到NSTableView的项目属性范例

NSTableView的API证明了这一点。请注意,表视图具有
selectedRowIndexes
selectedColumnIndexes
,但无法枚举将标识所选单个单元格的列、行对

最好实现自定义视图。您可能会很好地模拟NSTableView的数据源协议,例如,您可以拥有
电子表格视图:objectValueForColumnIndex:rowIndex:
,但除此之外,您还有很多工作要做,尤其是实现编辑


但是,从长远来看,这是获得单个细胞选择的最佳方法,也是唯一的方法。

好吧,我不认为我在尝试这样做(尽管我曾经设计并编程过一个卓越的电影电影预算软件工具——它类似于电子表格)。我看到了一个NSTableView,在该视图中,通过在单元格中切换选择整个单元格,然后按return键进入编辑模式。所以我认为它可以做到“开箱即用”。但你说服了我。更好的界面是,当鼠标“在”单元格上时,动态显示“箭头”图标。iTunes就是这样做的。有没有一种基于细胞的方法可以做到这一点?或者可能是子类?@SMGreenfield:鼠标悬停是通过跟踪视图中的区域来处理的,因此您必须将NSTableView子类化才能做到这一点。假设您希望在每个单元格上输入和退出一个跟踪区域(这意味着您需要在行进出、列重新排序、列大小调整等情况下使跟踪区域无效)。谢谢--您的建议将是处理基于单元格的表视图的准确方法(因此我将您的答案标记为已接受)。但是,我想我会等待使用“基于视图”的表视图(最低目标为10.7)。看起来容易多了。有一个苹果开发者“HoverTableDemo”演示了这个方法。
- (BOOL)shouldFocusCell:(NSCell *)cell atColumn:(NSInteger)column row:(NSInteger)row;