【问题标题】:NSTableView selection & highlightsNSTableView 选择和亮点
【发布时间】:2009-08-18 13:41:17
【问题描述】:

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

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

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

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

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

    return YES;
}

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

【问题讨论】:

标签: objective-c cocoa nstableview


【解决方案1】:

我想实现一个类似的解决方案(使用 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

【讨论】:

    【解决方案2】:

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

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

    SO here 上也有一个答案,用于以编程方式设置。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 我将 'highlight:withFrame:inView:' 放在我的 NSTextField 子类中,但它从未被调用过。但是覆盖 'highlightSelectionInClipRect:' 成功了,谢谢!我想到了“resignFirstResponder”,但不幸的是,我向 NSTableView 添加了一个子视图,以便用户可以编辑单元格内容。还有其他方法吗?
      • 您是否使用普通字段编辑器进行编辑? NSTableView 的 resignFirstResponder 在您单击外部时不会被调用(即使使用此子视图)?
      • 不,我创建了自己的更复杂的视图来编辑所选对象。 resignFirstResponder 被调用,但是当编辑视图成为第一响应者时它也会被调用,你可以在上面看到我试图“监督”这个事件。
      • 如果你的特殊编辑器是NSTextField的子类,那么你可以通过重载NSTableView的-currentEditor让NSTableView管理它。这样,您就不会添加新视图;你让 NSTableView 的内置字段编辑器系统为你工作。
      • 不幸的是它不是。这是一个 NSView,有很多东西,比如子视图、PopUpButtons 等。=/
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多