31

让我简短地总结一下:nib 文件中的“First Responder”是一个对象,它表示具有用户焦点的 UI 控件元素。因此,如果用户单击一个控件,nib 会将单击的 UI 控件设置为 First Responder。在我的应用程序中,我可以从笔尖向那个“急救人员”提供一个出口,这样我就可以向用户通过点击激活的任何内容发送一条消息“制作红色字体颜色”。

然后,如果此 First Responder UI 控件不理解该消息,则该消息将在响应者链中向上传递,直到父元素或祖父(等等)UI 控件元素理解该消息。否则会被忽略。

因此,First Responder 总是建立一个指向具有焦点的 UI 控件的“链接”。是对的吗?

4

4 回答 4

44

正确的总体情况,错误的第一段实现细节。

NibFile 中的“First Responder”是一个对象……</p>

不,实际上,First Responder 是nil。在 nib 中将 UI 控件(例如,按钮)连接到 First Responder 相当于[control setTarget:nil]在代码中。

在 nib 窗口中出现 First Responder fake-object 的原因是,在 IB 中,您同时设置了 target 和 action(ctrl-drag 到 target,从弹出菜单中选择 action)。您不能像在代码中那样设置操作并保持目标未设置,因此要将其设置为nil,您需要明确地这样做。这就是 First Responder 的用途:它是一个代表 的假对象nil,因此您可以设置目标和操作,就像将其设置为特定的真实目标时一样。

当然,您不能使用它来设置任何其他内容nil,只能设置视图的目标。您只能用它来表示 First Responder,而不是其他任何东西。

因此,如果用户单击 UI 控件,则 Nib 会设置……</p>

笔尖什么都不做。它只是存储在磁盘上的冻干对象集合。即使你实例化 NSNib,你所做的只是解冻一些对象。做事的是对象。

在手头的情况下,当您从 nib 取消归档连接到 First Responder 的控件时,它的目标设置为nil(请记住,这才是 First Responder 的真正含义: 的目标nil)。当控件的目标是nil并且用户单击它时,它会将其操作发送给当时是第一响应者的响应者。

你的第二和第三段是正确的。

于 2009-02-28T20:52:15.800 回答
3

你的理解是不完整的。响应者链包含的不仅仅是我们通常认为的“UI 控件”,还包括最重要的当前文档。最大的好处之一是它允许您与概念上“当前”的任何内容(当前窗口、当前文本字段、当前文档等)进行交互,而无需大量寻找它。

于 2009-02-28T20:43:30.470 回答
2

查看此链接,它可以很好地解释。我认为你有它的要点:

http://cocoadev.com/FirstResponder

从来源:

FirstResponder 是响应者链中第一个有机会响应事件的对象。

于 2009-02-28T20:13:33.647 回答
2

响应者是在事件(例如单击按钮)发生时将执行操作(调用函数)的任何对象。响应者链是一系列对象,每个对象都包含在另一个对象中——例如,窗口内面板内的按钮。当一个事件发生时,我们遍历链,直到我们找到一个没有设置响应者nil并因此可以响应事件的对象。因此,我们可以为整个窗口提供一个响应者,而不是为窗口中的每个按钮提供一个响应者对象。第一响应者只是响应者链中的第一个对象——将事件链接到第一响应者允许事件向上传递链。

于 2009-12-26T11:30:37.570 回答