如何在NstableView中选择一个NSCELL?
-
03-10-2019 - |
题
我有一个小 NSTableView
带有复选框。每当未检查复选框时,我都想要一个相邻的 NSCell
s灰色且无法访问。
但是,我不知道如何仅处理一个特定的单元格。 -dataCellForRow
的 NSTableColumn
始终更改整个表列的模板单元格。
如何访问一个单元格?
编辑: 我使用 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];
}
笔记: 如今,我将表观视为参数,而不是依靠代表来保留对表观视图的参考。