NSTableView选择&强调

时间:2009-08-18 13:41:17

标签: objective-c cocoa nstableview

我有一个NSTableView作为我的应用程序的核心部分,并希望它与其余部分集成更多。它只有一列(它是一个列表),我自己绘制所有单元格(正常的NSTextFieldCells)。

第一个问题是突出显示。我自己画高光,想要摆脱蓝色背景。我现在用原始背景颜色填充整个单元格以隐藏蓝色背景,但是当拖动单元格时这看起来很糟糕。我尝试覆盖NSCell的highlight:withFrame:inView:highlightColorWithFrame:inView:,但没有发生任何事情。如何禁用自动突出显示?

当我点击NSTableView之外的某个地方时,我还希望取消选择所有行/单元格。由于所选单元格的背景/突出显示变为灰色,因此必须有一个事件,但我找不到它。我让我的细胞双击扩展,可能需要撤消这个。因此,摆脱灰色亮点是不够的。

编辑:当双击一个单元格然后调用NSTableView的resignFirstResponder时,我会向NSTableView添加一个子视图。我试过这个:

- (BOOL)resignFirstResponder
{
    if (![[self subviews] containsObject:[[self window] firstResponder]])
    {
        [self deselectAll:self];
        ...
    }

    return YES;
}

除了它不起作用之外,我还需要为视图层次结构中的所有对象实现此方法。是否有其他解决方案可以找出第一个响应者何时离开某个视图层次结构?

3 个答案:

答案 0 :(得分:2)

我想要实现一个类似的解决方案(使用NSOutlineView,但这没有区别):在大纲视图内部单击但不在一行中有一个单元格(例如在源列表的空底部),我想要要取消选择的当前选定行。我最终得到了一些可能有所帮助的代码。

在NSOutlineView子类中,我放了:

@implementation ClickOutlineView

- (void)mouseDown:(NSEvent *)theEvent
{
    NSPoint pointInWindow = [theEvent locationInWindow];
    NSPoint pointInOutlineView = [self convertPoint:pointInWindow toView:nil];

    int rowIndex = [self rowAtPoint:pointInOutlineView];

    if ([theEvent clickCount] == 1 && rowIndex == -1) {
        [self deselectAll:nil];
    }
    else {
        [super mouseDown:theEvent];
    }
}

@end

答案 1 :(得分:1)

毫无疑问,帮助问题的海报已经太迟了,但这可能有助于其他在Google上遇到此问题的人(就像我一样)。

您可以通过在“突出显示”下拉菜单中的Xcode 4中的属性检查器中选择“无”来阻止行选择。

SO here上还有一个答案可以通过编程方式进行设置。

答案 2 :(得分:0)

重载-highlight:withFrame:inView:应该是正确的。你是怎么做过载的? NSLog()语句是否表明您的代码正在运行?您还应该查看NSTableView的-highlightSelectionInClipRect:,这可能更方便。

当用户在表格视图外部点击时,为了做某事(例如取消选择当前选择),在NSTableView上重载-resignFirstResponder