4

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

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

当我单击 NSTableView 之外的某个位置时,我还希望取消选择所有行/单元格。由于所选单元格的背景/突出显示变为灰色,因此必须有一个事件,但我找不到它。我让我的单元格双击展开,可能需要撤消此操作。所以摆脱灰色高光是不够的。

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

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

    return YES;
}

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

4

3 回答 3

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
于 2012-03-24T11:46:54.560 回答
1

毫无疑问,现在帮助问题的海报为时已晚,但这可能会帮助其他在 Google 上遇到此问题的人(就像我一样)。

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

这里还有一个关于 SO 的答案,用于以编程方式设置它。

于 2013-01-10T07:05:37.050 回答
0

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

为了在用户单击表格视图外部时执行某些操作(例如取消选择当前选择),请-resignFirstResponder在 NSTableView 上重载。

于 2009-08-18T14:00:05.967 回答