首先,占位符是一个比代理更好的词。
通常,当您在 NIB/XIB 文件中有对象时,这意味着加载 NIB 文件将创建该实例。占位符对象是加载 NIB 文件时已经存在的对象,它们出现在 NIB 内部,以便您可以在将通过加载 NIB 创建的对象和已存在的对象之间建立连接。
文件的所有者、第一响应者和应用程序都是占位符。
文件的所有者是将加载 nib 的对象的占位符。所有 NIB 加载方法都采用“所有者”参数。当您与文件的所有者建立连接时,当它在运行时建立时,它将连接到传递给 nib 加载方法的所有者对象。许多 UIKit 和 AppKit 类为您调用 nib 加载方法。NSApplication
, NSViewController
, NSWindowController
, UIApplication
, 和UIViewController
所有代表您加载 NIB 文件。当他们这样做时,他们将 self 作为所有者参数传递给 nib 加载方法。这就是为什么当您使用视图控制器或窗口控制器时,您将文件的所有者设置为您的子类,并在视图和文件所有者之间建立大部分连接。
该NSApplication
实例是一个简单的占位符[NSApplication sharedApplication]
。这是一个全局单例,Interface Builder 中的图标代表该全局单例。加载 NIB 文件不会创建第二个NSApplication
实例。相比之下,当一个 NIB 文件包含一个窗口时,如果你加载它十几次,你将有十几个窗口实例,但仍然是一个NSApplication
实例。
第一响应者是独一无二的。将动作连接到第一响应者意味着当动作被触发时,它应该动态地发送到响应者链。响应者链通常从焦点视图开始,并继续向上通过视图层次结构并包括一些控制器和委托。链中的每个对象都可以处理动作。菜单项与响应者链配合得很好。如果您有一个“Make Bold”菜单项应该使当前选定的文本变为粗体,您可以先将其连接到NSApplication
子类,但是你必须知道“Make Bold”适用的所有情况,以及如何处理它们。文本视图和可编辑的 Web 视图可能需要不同的代码来处理“加粗”,并且将所有这些都装瓶到一个对象中会变得非常复杂并且不会非常可扩展。相反,您可以将“Make Bold”菜单项的操作连接到makeBold:
First Responder 上的操作。This would mean that when the menu item was selected, the focused object, or one of its parents that responded to makeBold:
, would get the makeBold:
message. 现在许多类可以实现一个makeBold:
方法并在它们处于焦点时响应这个菜单项。