“第一响应者” - 我做对了吗?

时间:2009-02-28 18:39:32

标签: objective-c cocoa nib first-responder

让我简要总结一下:nib文件中的“First Responder”是一个对象,它表示具有用户焦点的UI控件元素。因此,如果用户单击控件,则nib将单击的UI控件设置为First Responder。在我的应用程序中,我可以从笔尖找到“First Responder”的出口,这样我就可以通过点击向用户激活的任何内容发送消息“make red font color”。

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

因此,First Responder始终建立具有焦点的UI控件的“链接”。是吗?

4 个答案:

答案 0 :(得分:42)

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

  

NibFile中的“第一响应者”是一个对象......

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

nib窗口中First Responder假对象的原因是,在IB中,您同时设置目标和动作(按住Ctrl键拖动到目标,从弹出菜单中选择动作)。您无法像在代码中那样设置操作并保持目标未设置,因此要将其设置为nil,您需要明确地执行此操作。这就是First Responder的用途:它是一个代表nil的虚假对象,因此你可以像设置特定的真实目标一样设置目标和动作。

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

  

因此,如果用户点击UI控件,Nib就会设置...

笔尖没有做任何事情。它只是存储在磁盘上的冻干对象集合。即使你实例化NSNib,你所做的只是解冻一些对象。这是做事的对象。

在目前的情况下,当你从nib连接到First Responder的控件解压缩时,它的目标设置为nil(记住,这就是First Responder真正的目标:{{1}的目标})。当控件的目标为nil,并且用户点击它时,它会将其操作发送给当时第一个响应者的响应者。

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

答案 1 :(得分:3)

您的理解不完整。 responder chain包含的内容超出了我们通常认为的“UI控件”,其中最重要的是当前文档。其中一个巨大的好处是,它允许您与概念上的“当前”交互 - 当前窗口,当前文本字段,当前文档等 - 而不需要太多的麻烦来找到它。

答案 2 :(得分:2)

检查此链接,它做得很好解释。我认为你有它的要点:

http://cocoadev.com/FirstResponder

来自消息来源:

  

FirstResponder是第一个对象   在给出的响应者链中   有机会回应活动。

答案 3 :(得分:2)

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