代码之家  ›  专栏  ›  技术社区  ›  bastibe

如何在NSTableView中选择一个NSCell?

  •  1
  • bastibe  · 技术社区  · 14 年前

    NSTableView 带有复选框。每当复选框没有被选中时,我就想要一个相邻的 NSCell

    -dataCellForRow 属于 NSTableColumn 始终更改整个表列的模板单元格。

    编辑: 我使用 NSTableViewDataSource 协议。

    3 回复  |  直到 14 年前
        1
  •  8
  •   Rob Keniger    14 年前

    你不能“进入牢房”。 NSTableView 仅在必要时才请求数据,而不直接填充或控制数据。

    NSTableViewDatasource 也可以选择 NSTableViewDelegate 协议。然后,表视图将数据源消息发送到控制器,控制器提供适当的数据。

    通过实现 ‑tableView:setObjectValue:forTableColumn:row:

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

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

    有关使用数据源的详细信息,请参阅 the docs .

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

    如果需要使属性依赖于另一个属性的值,可以使用 Key-Value Observing

        2
  •  1
  •   aperkins    14 年前

    我试着记住确切的编辑器界面,我不是我的Mac旁边在家里,所以我不能做一个完整的步行通过它-希望这可以为您指出正确的方向。

        3
  •  0
  •   ctietze    10 年前

    自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];
    }
    

    之后,你可以使用 -视图ATColumn:row:使必要: 在委托/控制器对象中如下所示:

    - (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];
    
    }
    

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

    推荐文章