代码之家  ›  专栏  ›  技术社区  ›  Adam Preble

nstextview覆盖导致具有第一响应者状态的异常

  •  1
  • Adam Preble  · 技术社区  · 14 年前

    我有一个 NSTextView 在一个 NSScrollView ,并且我正在以编程方式插入 NSView 子类作为 nstextview(无文本视图) . 这个 NSVIEW 作为一个覆盖,叠加其下文本的图形信息。

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

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

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

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

    1. 创建一个简单的旧的非文档可可应用程序。
    2. 向应用程序委托添加“nstextview”iboutlet。
    3. 添加一个 nstextview(无文本视图) 到mainmenu.xib中的窗口。连接textview插座。
    4. 输入一点代码:

    applicationDidFinishLaunching:

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

    运行应用程序,注意右键单击文本区域并不能正常工作,但是您仍然可以与文本视图进行交互。

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


    有什么方法可以使 nstextview(无文本视图) 接受它的所有事件,即使我 NSVIEW 覆盖不接受第一响应程序或鼠标事件?我怀疑这可能与字段编辑器有关,也许它忽略了它认为要发送到覆盖视图的事件?

    3 回复  |  直到 13 年前
        1
  •  1
  •   Peter Hosey    14 年前

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

        2
  •  0
  •   JWWalker    14 年前

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

        3
  •  0
  •   Dalmazio    13 年前

    处理这一问题的一个简单方法是将覆盖视图设置为nsview的自定义子类,然后重写 测试: 始终返回的方法 . 这将阻止覆盖视图参与响应程序链。相反,事件将自动发送到它的超级视图或视图层次结构的更高层。您可能还需要重写 接受第一响应者 返回 为了安全(以防意外设置)。