1

当 Cocoa NIB 文件实例化自定义控制器对象的实例时,该自定义控制器实例分配给的变量的名称是什么?

如果不清楚,如果您手动创建了该类的实例,您将执行以下操作:

MyControllerClass *myVar = [[MyControllerClass alloc] init];

在幕后执行此操作时,NIB 使用了什么相当于“myVar”?

4

5 回答 5

2

在您的控制器类中实现awakeFromNib方法 - 在 nib 完成加载后立即调用它,并且您的控制器实例可以在“self”变量中找到。

于 2010-02-04T09:23:05.600 回答
2

一旦编译了应用程序,就没有变量名这样的东西,所以这个问题没有多大意义。在您的示例中,myVar它只是您(程序员)的一个方便标签,一旦您的源代码编译成二进制代码,它就不会以任何方式存在。

当您将一个对象放入一个 nib 文件时,它会在运行时被归档然后取消归档。如果您希望能够获得对已存档在 nib 文件中的对象的引用,则需要使用 outlet,这意味着您IBOutlet在 nib 文件中存在的类中声明一个实例变量,然后将其连接起来指向要在 Interface Builder 中引用的 nib 中的对象。实例变量与您在示例中声明的堆栈变量不同,可以在运行时引用。

通常,您将拥有一个“拥有”笔尖的对象。NSWindowController通常 nib 由or的实例加载,NSViewController并且窗口或视图控制器在 nib 文件中表示为File's Owner。如果您在窗口/视图控制器中声明了出口,则可以将文件所有者的出口连接到 Interface Builder 中的对象。

因此,为了澄清,您需要从同一笔尖中的其他对象引用您的笔尖中的对象。IBOutlet第二个对象使用实例变量上的关键字声明一个出口,如下所示:

@interface SomeOtherObject : NSObject
{
    IBOutlet SomeObject* anObject;
}
@end

在 Interface Builder 中,您可以将实例的anObject出口连接SomeOtherObject到第一个SomeObject实例。您可以通过控制从一个对象拖动到另一个对象来执行此操作,也可以在 Interface Builder 检查器的连接面板中执行此操作。

然后,您可以通过代码中的变量名称来引用您的SomeObject实例。anObjectSomeOtherObject

于 2010-02-04T07:36:56.097 回答
0

......该自定义控制器实例分配给的变量的名称是什么?

它是您在声明该变量时给它起的任何名称。

IB 不会为您创建变量。听起来您正在寻找一个outlet,这是您创建的一个变量,IB 知道它并允许您将对象插入其中,从而设置该变量。

(您实际上可以从 IB 创建插座,在现代运行时,这应该真正创建插座,而不仅仅是在 nib 中声明一个不存在的插座。即使这样,创建插座 [in IB] 并且给它一个名字。)

于 2010-02-04T12:09:08.323 回答
0

我认为 Nibbles 感到困惑的是如何从代码中引用仅在 NIB 文件中定义的变量。

答案是,通常你在代码和 NIB 中有一个自定义控制器类(或委托类)A,如果你有另一个类或控制器 B 只在 NIB 中定义,只需在 A 中设置一个指向 B 的插座。因为 A可以在代码中的任何地方使用,B 也可以通过 A 访问。

我也有这个问题。

于 2010-04-09T22:21:57.163 回答
0

@tedge(我无法对您的回答发表评论):

您能否为刚开始学习 Cocoa 的人澄清一下。学习 Apple 货币转换器教程。

我在现有的 ConverterController 类中实现了 awakeFromNib 方法。(我很快就会学会做的事情!)

应用程序启动并自动实例化 ConverterController 的一个实例。

awakeFromNib 会告诉我关于那个正在运行的实例的什么信息(除了它已经准备好使用)——以及“self”的什么语法让它泄露这些信息?

于 2010-02-04T10:58:41.030 回答