Cocoa NSTextView覆盖会导致第一响应者状态异常

Cocoa NSTextView覆盖会导致第一响应者状态异常,cocoa,nstextview,first-responder,Cocoa,Nstextview,First Responder,我在NSScrollView中有一个NSTextView,我正在以编程方式插入一个NSView子类作为NSTextView的子视图。此NSView用作覆盖,将有关其下方文本的图形信息叠加在一起 我认为它工作得很好,直到我注意到文本视图没有响应右键单击。其他操作(编辑、选择)似乎工作正常 此外,如果第一响应者更改为滚动视图(例如,大纲视图)的同级,则文本视图不会通过单击它来恢复第一响应者的状态。选择将随着单击而更改,但选择突出显示为灰色而不是蓝色(表示文本视图不是第一个响应者) 如果偏移覆盖子视图

我在
NSScrollView
中有一个
NSTextView
,我正在以编程方式插入一个
NSView
子类作为
NSTextView
的子视图。此
NSView
用作覆盖,将有关其下方文本的图形信息叠加在一起

我认为它工作得很好,直到我注意到文本视图没有响应右键单击。其他操作(编辑、选择)似乎工作正常

此外,如果第一响应者更改为滚动视图(例如,大纲视图)的同级,则文本视图不会通过单击它来恢复第一响应者的状态。选择将随着单击而更改,但选择突出显示为灰色而不是蓝色(表示文本视图不是第一个响应者)

如果偏移覆盖子视图的框架,则文本视图在覆盖未重叠的区域中的行为正常为100%,但重叠区域的行为不正确,如上所述

在Mac OS X 10.6.4上复制此行为的步骤:

  • 创建一个普通的旧的非基于文档的Cocoa应用程序
  • 在app delegate.h中添加一个'NSTextView'IBOutlet
  • NSTextView
    添加到MainMenu.xib中的窗口。连接textView插座
  • 键入一段代码:
  • ApplicationIDFinishLaunching:

    NSView *overlay = [[NSView alloc] initWithFrame:textView.bounds];
    [textView addSubview:overlay];
    [overlay release];
    
    运行该应用程序,注意文本区域中的右键单击无法正常工作,但您仍可以与文本视图交互

    接下来,将NSOutlineView添加到xib中的窗口。注意,一旦焦点离开文本区域(如果单击大纲视图)并覆盖到位,就无法将焦点设置回文本视图(它不会再次成为第一响应者)



    即使我的
    NSView
    覆盖不接受第一响应程序或鼠标事件,是否有办法使
    NSTextView
    能够接收其所有事件?我怀疑这可能与“字段编辑器”(field editor)有关——也许它忽略了它认为注定要进入“覆盖视图”(overlay view)的事件?

    我对此没有太多经验,但另一种可能是使用核心动画层作为覆盖层。

    我对此没有太多经验,但另一种可能是使用核心动画层作为覆盖。您可能需要将覆盖作为自定义视图类的实例,该类将所有事件和可访问性消息转发到文本视图。您可能还需要将任何视图相对坐标转换为文本视图的坐标系。

    您可能需要将覆盖设置为自定义视图类的实例,该类将所有事件和辅助功能消息转发到文本视图。您可能还需要将任何视图的相对坐标转换为文本视图的坐标系。

    处理此问题的干净方法是将覆盖视图设置为NSView的自定义子类,然后覆盖hitTest:方法以始终返回nil。这将阻止覆盖视图参与响应器链。相反,事件将自动发送到它的superview或视图层次结构的更高级别。您可能还希望覆盖acceptsFirstResponder以返回NO以确保安全(以防意外地通过编程设置)。

    处理此问题的干净方法是将覆盖视图设置为NSView的自定义子类,然后覆盖hitTest:方法以始终返回nil。这将阻止覆盖视图参与响应器链。相反,事件将自动发送到它的superview或视图层次结构的更高级别。您可能还想覆盖acceptsFirstResponder以返回NO以确保安全(以防意外通过编程设置)。

    需要更多上下文(以及可能的代码)。您能否更详细地描述您认为缺少的内容?事实证明,在从头构建的应用程序中复制非常简单。我添加了复制的步骤。需要更多的上下文(以及可能的代码)。你能更详细地描述一下你认为缺少的内容吗?事实证明,在从头开始构建的应用程序中复制是非常简单的。我添加了复制的步骤。感谢您的建议,但是我对响应鼠标事件特别感兴趣,并且不希望在将鼠标事件映射到子层等方面重新发明轮子。感谢您的建议,然而,我对响应鼠标事件特别感兴趣,并且不想在将鼠标事件映射到子层等方面重新发明轮子。