1

我有一个小NSTableView复选框。每当未选中该复选框时,我希望相邻NSCell的 s 之一变灰且无法访问。

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

如何访问一个单元格?

编辑:NSTableViewDataSource我使用协议填充表格视图。

4

3 回答 3

8

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

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

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

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

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

有关使用数据源的更多信息在docs中。

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

如果需要使属性依赖于另一个属性的值,可以使用Key-Value Observing文档中概述的依赖键机制。

于 2010-05-05T06:37:10.250 回答
1

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

我正在努力记住确切的编辑器界面,而且我不在家里的 Mac 旁边,所以我无法完全了解它 - 希望这可以为您指明正确的方向。

于 2010-05-04T20:07:35.323 回答
0

从 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];

}

注意:现在,我会将表格视图作为参数传递给委托,而不是依赖委托来保持对表格视图的引用。

于 2014-08-28T07:37:53.693 回答