我有一个小 NSTableView 带有复选框。每当未检查复选框时,我都想要一个相邻的 NSCells灰色且无法访问。

但是,我不知道如何仅处理一个特定的单元格。 -dataCellForRowNSTableColumn 始终更改整个表列的模板单元格。

如何访问一个单元格?

编辑: 我使用 NSTableViewDataSource 协议。

有帮助吗?

解决方案

您不“访问单元格”。 NSTableView 仅在必要时才询问数据,您不会填充它或直接控制数据。

相反,您创建一个控制器对象,该对象实现了 NSTableViewDatasource 并且可选 NSTableViewDelegate 协议。然后,表视图将数据源消息发送给您的控制器,并且控制器提供适当的数据。

您可以通过实现表观中显示的对象进行编辑 ‑tableView:setObjectValue:forTableColumn:row: 数据源方法。当用户单击复选框时,将在您的控制器对象上调用此方法。适当地更新模型是您的控制器的责任。

更新模型后,您的控制器应将表视图告诉重新加载。然后,表视图将向您的控制器询问需要使用该单元格的值 ‑tableView:objectValueForTableColumn:row: 数据源方法。这将包括您需要禁用的单元格。您的控制器需要为单元提供适当的值。

如果您需要对单元格的更多控制,则可以实现‑tableView:willDisplayCell:forTableColumn:row: 委托法。在显示单元格之前,这是调用的,您可以适当地修改单元格。

有关使用数据源的更多信息 文档.

另一个选项(而不是使用数据源)是使用可可绑定和 NSArrayController 您可以绑定到模型对象的集合。在这种情况下,您可以绑定 Enabled 将表列与模型对象的某些属性结合,该对象控制了单元格启用状态。您有责任确保该财产的状态正确。

如果您需要使该属性取决于另一个属性的值,则可以使用在 键值观察 文档。

其他提示

您可以将该列的编辑性绑定到复选框中显示的值吗?即,如果检查它,则可以编辑,否则不是吗?

我试图记住确切的编辑器界面,而且我在家里不在Mac旁边,所以我无法全面走动 - 希望这可以指向您正确的方向。

由于SDK版本10.7,有 -viewAtColumn:row:makeIfNecessary:NSTableView. 。我在网络上发现的大多数信息尚未考虑新方法,因此在这里,所有其他人都在寻找这个问题的答案。

从鼠标事件到细胞选择

首先,为您的控制器添加协议以从表视图中处理单元格选择,例如:

@protocol XYZCellSelectionDelegate <NSObject>
- (void)cellViewWasSelectedAtRow:(NSInteger)row column:(NSInteger)column;
@end

然后子类 NSTableView 和覆盖 -mouseDown:

// In your Custom Table View subclass:
- (void)mouseDown:(NSEvent *)event
{
    NSPoint point = [self convertPoint:[event locationInWindow] fromView:nil];
    NSInteger selectedRowIndex = [self rowAtPoint:point];
    NSInteger selectedColumnIndex = [self columnAtPoint:point];

    if ([self.calendarViewDelegate respondsToSelector:@selector(cellViewWasSelectedAtRow:column:)])
    {
        [self.calendarViewDelegate cellViewWasSelectedAtRow:selectedRowIndex column:selectedColumnIndex];
    }

    [super mouseDown:event];
}

之后,您可以使用 -viewAtColumn:row:makeIfNecessary: 这样的代表/控制器对象中的这样

- (void)cellViewWasSelectedAtRow:(NSInteger)row column:(NSInteger)column
{
    NSView *selectedView = [self.tableView viewAtColumn:column row:row makeIfNecessary:YES];

    // Do something with the cell to the right
    NSInteger nextColumn = column + 1;
    NSView *cellNextToIt = [self.calendarTableView viewAtColumn:nextColumn row:row makeIfNecessary:YES];

}

笔记: 如今,我将表观视为参数,而不是依靠代表来保留对表观视图的参考。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top