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