我有一个小NSTableView
复选框。每当未选中该复选框时,我希望相邻NSCell
的 s 之一变灰且无法访问。
但是,我不知道如何只处理一个特定的单元格。-dataCellForRow
ofNSTableColumn
总是更改整个表格列的模板单元格。
如何访问一个单元格?
编辑:NSTableViewDataSource
我使用协议填充表格视图。
我有一个小NSTableView
复选框。每当未选中该复选框时,我希望相邻NSCell
的 s 之一变灰且无法访问。
但是,我不知道如何只处理一个特定的单元格。-dataCellForRow
ofNSTableColumn
总是更改整个表格列的模板单元格。
如何访问一个单元格?
编辑:NSTableViewDataSource
我使用协议填充表格视图。
您不会“访问单元格”。NSTableView
仅在必要时要求数据,您不会直接填充或控制它。
相反,您创建了一个控制器对象,它实现了协议NSTableViewDatasource
和可选NSTableViewDelegate
协议。然后表格视图将数据源消息发送到您的控制器,您的控制器提供适当的数据。
‑tableView:setObjectValue:forTableColumn:row:
您可以通过实现数据源方法来允许编辑表格视图中显示的对象。当用户单击复选框时,将在您的控制器对象上调用此方法。适当地更新模型是您的控制器的责任。
当模型更新时,你的控制器应该告诉表视图重新加载。然后,表格视图将向您的控制器询问需要使用‑tableView:objectValueForTableColumn:row:
数据源方法显示的任何单元格的值。这将包括您需要禁用的单元格。您的控制器需要为单元格提供适当的值。
如果您需要对单元格进行更多控制,则可以实现
‑tableView:willDisplayCell:forTableColumn:row:
委托方法。这是在显示单元格之前调用的,您可以适当地修改单元格。
有关使用数据源的更多信息在docs中。
另一个选项(而不是使用数据源)是使用 Cocoa 绑定和NSArrayController
绑定到模型对象集合的绑定。在这种情况下,您可以将Enabled
表格列的绑定绑定到模型对象的某些属性,该属性控制单元格的启用状态。您有责任确保该财产的状态正确。
如果需要使属性依赖于另一个属性的值,可以使用Key-Value Observing文档中概述的依赖键机制。
您能否将该列的可编辑性绑定到复选框中显示的值?即如果它被选中,它是可编辑的,否则它不是?
我正在努力记住确切的编辑器界面,而且我不在家里的 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];
}
注意:现在,我会将表格视图作为参数传递给委托,而不是依赖委托来保持对表格视图的引用。