关于 cocoa:在 Objective-C 中连接委托类

关于 cocoa:在 Objective-C 中连接委托类

Connecting delegate classes in Objective-C

我的 Interface Builder 文件中有两个控件,每个控件我都在代码中创建了一个单独的委托类(Control1Delegate 和 Control2Delegate)。我在界面生成器中创建了两个"对象",将它们设为该类型,并将控件作为委托连接到它们。代表们工作得很好。我的问题是,我需要将信息从一位代表分享给另一位代表,但我不确定如何。

最好的方法是什么?将两个代表组合成一个类,或者以某种方式访问??他们都可以阅读的第三个类?由于我实际上并未在代码中的任何位置初始化类,因此我不确定如何获取对它的实际实例的引用(如果有它的实际实例),甚至不知道如何访问 "main " 项目附带的类。


您可以将任一委托的出口添加到另一委托。有两种方法可以向 IB 中的对象添加outlets(假设您使用的是 Xcode/IB 3.0 或更高版本:

  • 如果您还没有为您的委托类生成代码,请选择所需的委托,然后在 IB 检查器中打开"对象标识"选项卡。添加一个 NSObject 类型的"类出口"。然后,您应该能够将此新出口设置给其他代表。当然,您必须为您的委托类生成代码并将生成的源文件添加到您的 Xcode 项目中,然后才能加载 nib。

  • 如果您已经为委托类生成了代码(或向您的 NIB 添加了一个 NSObject 并将其 Class 设置为您的 Xcode 项目中的现有类),请向委托类添加一个实例变量:

    IBOutlet id outletToOtherDelegate;

    只要您的 Xcode 项目处于打开状态(如您的 NIB 窗口左下角的绿色气泡所示),IB 将自动检测新的outlets并允许您将其分配给您的 NIB 中的其他委托对象.

  • Cocoa 在 NIB 加载时自动连接这些outlets。在委托对象的实例上调用 awakeFromNib 后,您可以假设 NIB 中的所有其他对象都已实例化并且所有出口都已连接。但是,您不应该假定调用 awakeFromNib 的顺序。


    由于我在工作,目前我面前没有我的 Mac,但是否可以将一个代表的实例绑定到另一个代表的成员?这类似于将 NSArrayController 绑定到另一个控制器类的成员,例如。

    但是,根据委托类所做的事情,如果任务相似,我可能会将它们合并到一个类中。这将完全消除问题。


    我认为您可以在每个outlets上创建outlets并交叉绑定它们,以便它们始终拥有相同的数据。如果他们需要共享一个模型对象,那就很整洁了。我实际上不知道该怎么做。我想我曾经在 iPhone 教程中看到过它!


    推荐阅读