gpt4 book ai didi

objective-c - 如果事件不处理,则将事件发送到另一个 NSControl 下的 NSControl

转载 作者:行者123 更新时间:2023-12-03 17:37:15 25 4
gpt4 key购买 nike

我有多个叠加的控件,可以在某些条件下处理鼠标单击。我想要做的是:

  1. 顶部控件接收mouseDown:事件。
  2. 顶部控件决定是否处理 mouseDown: 事件。
  3. 如果是这样,请采取措施并阻止其他控件接收 mouseDown: 事件。
  4. 如果没有,请将事件发送到下面的控件。
  5. 该控件决定是否处理事件。
  6. 等等

本质上,我试图将事件发送到“Z-Order”位于顶部控件下方的控件,而顶部控件不需要了解其他控件或需要一些信息实例化时的特殊设置。

我想到的第一件事是将事件发送到[topControl nextResponder],但窗口上所有控件的nextResponder似乎是窗口本身而不是像我之前想象的那样基于 Z 顺序的一系列控件。

有没有办法做到这一点,而无需手动设置下一个响应者?目标是获得一个独立于其他控件的控件,并且可以将其放在窗口上并按预期工作。

提前致谢!

最佳答案

您所要做的就是调用[super mouseDown:event]。从 Mac OS X 10.5 开始(这以前的工作方式)NSView 知道如何处理重叠 View ,并将为您处理事件。

<小时/>

如果您需要定位 10.5 之前的版本:这是一个非常糟糕的主意。不仅事件处理机制不知道如何处理重叠的 subview ,绘图系统也不知道如何处理,并且您可以看到一些非常奇怪的人工制品。也就是说,如果您下定决心:

覆盖自定义控件/ View 中的-[NSView hitTest:]。 AppKit 使用此方法来确定将鼠标事件传递到层次结构中的哪个 View 。如果您返回nil,则自定义 View 中的该点将被忽略,并且该事件应传递到覆盖该点的下一个 View 。

但请注意,由于我上面概述的原因,这仍然是一个坏主意。只是当时 AppKit 还没有正式支持它。10.4 及更早版本上更普遍接受的解决方法是使用子窗口。

关于objective-c - 如果事件不处理,则将事件发送到另一个 NSControl 下的 NSControl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1539386/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com