【问题标题】:NSTextView overlay causes oddities with first responder statusNSTextView 覆盖导致第一响应者状态异常
【发布时间】:2010-10-28 18:27:27
【问题描述】:

我在NSScrollView 中有一个NSTextView,并且我正在以编程方式插入一个NSView 子类作为NSTextView 的子视图。这个NSView 充当叠加层,将有关其下方文本的图形信息叠加在一起。

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

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

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

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

  1. 创建一个普通的旧的非基于文档的 Cocoa 应用程序。
  2. 将“NSTextView”IBOutlet 添加到应用委托.h。
  3. 在 MainMenu.xib 的窗口中添加 NSTextView。连接 textView 插座。
  4. 输入一段代码:

applicationDidFinishLaunching:

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

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

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


有没有什么方法可以让NSTextView 接收它的所有事件,即使我的NSView 覆盖不接受第一响应者或鼠标事件?我怀疑这可能与字段编辑器有关——也许它忽略了它认为注定要发送到覆盖视图的事件?

【问题讨论】:

  • 需要更多上下文(和可能的代码)。
  • 您能否更详细地描述您认为缺失的内容?
  • 事实证明,在从头构建的应用程序中进行复制非常简单。我已经添加了重现的步骤。

标签: cocoa nstextview first-responder


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 欣赏这个建议,但是我对响应鼠标事件特别感兴趣,并且不希望在将它们映射到子层等方面重新发明轮子。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-10
      • 2011-07-07
      • 1970-01-01
      • 2014-01-08
      • 2018-08-15
      • 2012-07-19
      相关资源
      最近更新 更多