NSTextView叠加导致具有第一响应者状态的奇怪

时间:2010-10-28 18:27:28

标签: cocoa nstextview first-responder

我在NSTextView中有NSScrollView,我正在以编程方式插入NSView子类作为NSTextView的子视图。此NSView充当叠加层,叠加有关其下方文字的图形信息。

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

此外,如果第一响应者更改为滚动视图的兄弟(例如,大纲视图),则文本视图不会通过单击它来重新获得第一响应者状态。选择将根据点击而改变,但选择突出显示为灰色而不是蓝色(表示文本视图不是第一个响应者)。

如果我偏移叠加子视图的帧,则文本视图在不与叠加重叠的区域中正常表现100%,但重叠区域的行为不正确,如上所述。

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

  1. 创建一个简单的旧的非基于文档的Cocoa应用程序。
  2. 将“NSTextView”IBOutlet添加到app delegate .h。
  3. NSTextView添加到MainMenu.xib中的窗口。连接textView插座。
  4. 输入一些代码:
  5. applicationDidFinishLaunching:

    NSView *overlay = [[NSView alloc] initWithFrame:textView.bounds];
    [textView addSubview:overlay];
    [overlay release];
    

    运行应用程序,观察文本区域中的右键单击无法正常工作,但您仍然可以与文本视图进行交互。

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


    即使我的NSTextView叠加层不接受第一响应者或鼠标事件,我是否可以通过某种方式启用NSView接收其所有事件?我怀疑这可能与字段编辑器有关 - 也许它忽略了它认为注定要覆盖视图的事件?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我没有太多的使用经验,但另一种可能性是使用核心动画层作为叠加层。

答案 2 :(得分:0)

处理此问题的一种简洁方法是使覆盖视图成为NSView的自定义子类,然后重写 hitTest:方法以始终返回 nil 。这将阻止叠加视图参与响应者链。相反,事件将自动发送到它的超级视图或在视图层次结构的更高位置查看。您可能还想覆盖 acceptsFirstResponder 以返回 NO 以确保安全(如果它是以编程方式意外设置的话)。