禁用 NSTableView 行焦点环

Disabling the NSTableView row focus ring

如何在用户右键单击 NSTableView 行时禁用焦点环?我不能让它消失。将table中个人NSTableViewCell的对焦环设置为None没有效果。

新:

这是我的做法。 您可以手动处理菜单。子类 NSTableRowViewNSTableCellView,然后使用 rightMouseDown:mouseDown:(检查控制键)然后通知您的 tableViewController(通知或委托) 的点击次数。不要忘记也传递该事件,然后您可以在 table 视图上显示带有事件的菜单,而无需聚焦环。 上面的答案比较简单,但是也可能像作者说的那样,过不了审。 另外,您可以为每一行显示单独的菜单项(如果您有不同类型的视图)

旧:

我认为聚焦环是由NSTableRowView定义的,而不是NSTableCellView,因为它负责整行。尝试在那里更改对焦环。您可以继承 NSTableRowView 并通过 IB 或 NSTableViewDelegate 的方法将其添加到 tableView:

- (NSTableRowView *)tableView:(NSTableView *)tableView rowViewForRow:(NSInteger)row

子类化 table 视图并实现以下方法:

- (void)drawContextMenuHighlightForRow:(NSInteger)row {
    // do nothing
}

注意:

  1. 蓝色轮廓不是对焦环
  2. 这是 Apple 用于绘制轮廓的未记录私有方法。提供一个空的实现会阻止任何东西被绘制,但我不能100%确定它是否能通过审查。

如果您的目标只是显示上下文菜单,您也可以试试这个。

  • NSOutlineView 包裹在另一个 NSView 中。
  • 覆盖包装器视图上的 menuForEvent 方法。
  • 不要在大纲视图上设置 menu

现在包装视图显示菜单而不是大纲视图,因此它不会显示聚焦环。有关如何在菜单事件中查找节点的信息,请参阅 How do you add context senstive menu to NSOutlineView (ie right click menu)