cocoa - 当 NSWindow 对象具有 NSWindow 子类的委托(delegate)时,谁负责对接收到的事件进行操作?

标签 cocoa

因此,我正在构建一个程序,该程序的特点是使用 IKImageBrowserView 组件作为 NSWindow 中的 subview 。作为旁注,我有一个名为 ImageBrowserController 的 Controller 对象,它是 NSWindow 的子类,并被设置为我的应用程序的 NSWindow 对象的委托(delegate)。

我已向 IKImageBrowserView 发送了消息 setCanControlQuickLookPanel:YES,以使其能够在 IKImageBrowserView 是接收按键事件的第一响应者时自动使用 QuickLook 功能来预览图像文件。然后我花了一段时间才弄清楚如何使 IKImageBrowserView 成为第一响应者,我最终通过覆盖 ImageBrowserController 内的 AcceptFirstResponder 来工作。

现在我明白,作为 NSWindow 的委托(delegate),在 NSWindow 上触发事件后,ImageBrowserController 在响应者链中占有一席之地。据我了解,作为 NSWindow 的 subview ,IKImageBrowserView 需要传递事件以进行事件处理。我不明白的是作为第一响应者的 ImageBrowserController 与以某种方式使其到达 IKImageBrowserView 的事件之间的连接在哪里。我没有明确将 NSWindow 或 IKImageBrowserView 设置为第一响应者。那么为什么我不需要在 ImageBrowserController 中实现事件处理呢?

编辑:因此,在阅读了接受的答案并返回到我的代码后,我尝试删除 ImageBrowserController 中的 AcceptFirstResponder 覆盖,并且 QuickLook 功能仍然像接受的那样触发答案说会。当我尝试通过空格键调用 QuickLook 功能时,注释掉 setCanControlQuickLookPanel:YES 会使应用程序发出蜂鸣声。我感觉我的问题是由于 XCode 用户在更改代码后点击 RUN 按钮而不是 BUILD 按钮时出现错误造成的(叹息)。

最佳答案

您所说的有关对象之间交互的一些内容没有意义,并且在没有背景知识的情况下很难解决您提出的问题。

正如您所说,您的窗口委托(delegate)在响应者链的末尾有一个位置,在窗口本身之后。我认为您缺少的关键点是 GUI 元素,例如您的 IKImageBrowserView ,将位于链的开始处,并且它们中的任何一个都位于给定窗口中可能是当前的 firstResponder

当您的应用程序获取事件时,它将其传递到按键窗口(即当前接受“按键”(即“击键”)事件的窗口)。该窗口首先要求其 firstResponder 处理该事件。如果该对象拒绝,它会将事件传递给自己的 nextResponder(通常是其 super View ),后者要么处理该事件,要么将其传递下去,直到该事件已被处理或一直传递到窗口对象本身。只有这样,窗口(如果它本身不处理事件)才会请求其委托(delegate)来处理事件。

这意味着窗口委托(delegate)和 IKImageBrowserView 之间的连接仅通过 Responder Chain ,其本质很简单,如果 View 拒绝处理任何给定事件,委托(delegate)最终可能会被要求处理它,如果它们之间没有其他对象首先处理它

您的窗口委托(delegate)不需要是 firstResponder。重写窗口委托(delegate)上的 acceptsFirstResponder 也不会对窗口的 subview 之一产生任何影响。*

您的窗口委托(delegate)也不需要(实际上不应该)是NSWindow的子类。它所需要的只是成为 NSObject 的子类,它实现 NSWindowDelegate Protocol 中的任何方法。您感兴趣的方法,以及处理您可能想要捕获的任何事件(如果其他对象未处理这些事件)的方法。

所以,最后你的明确问题的答案是(我并不是讽刺):如果你希望窗口委托(delegate)本身处理事件,你只需要在窗口委托(delegate)中实现事件处理。

<小时/>

*:IKImageBrowserView 已对 acceptsFirstResponder 响应 YES。如果您的窗口中没有其他 subview ,那么当您的应用程序启动时,它将自动成为 firstResponder。您可以通过将窗口上的导出连接到您想要的任何对象,在 Interface Builder 中显式设置此 initialFirstResponder

关于cocoa - 当 NSWindow 对象具有 NSWindow 子类的委托(delegate)时,谁负责对接收到的事件进行操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5327847/

相关文章:

cocoa - 如何在 .emacs 文件中检测 Cocoa Emacs?

cocoa - 在事件函数中更新 NSView

cocoa - 日历更改时是否会通过系统偏好设置发出通知?

ios - NSUserDefaults 在同步时崩溃

macos - 为什么 NSWindow 动画师 setFrame :display:animate: didn't work sometimes?

objective-c - Mac 操作系统 cocoa : Draw a simple pixel on a canvas

Xcode - 从另一个的半 View

Cocoa:以编程方式将 NSView 相互链接以使布局变得简单?

macos - 如何以编程方式以特定分辨率渲染全屏 openGL?

xcode - 在 Xcode4 项目中包含 C 工具