Cocoa:NIB 文件创建的实例的 var 名称是啥?
Posted
技术标签:
【中文标题】Cocoa:NIB 文件创建的实例的 var 名称是啥?【英文标题】:Cocoa: what is the var name of an instance created by a NIB file?Cocoa:NIB 文件创建的实例的 var 名称是什么? 【发布时间】:2010-02-04 07:22:24 【问题描述】:当 Cocoa NIB 文件实例化自定义控制器对象的实例时,该自定义控制器实例分配给的变量的名称是什么?
如果不清楚,如果您手动创建该类的实例,您会这样做:
MyControllerClass *myVar = [[MyControllerClass alloc] init];
在幕后执行此操作时,NIB 使用了什么等效的“myVar”?
【问题讨论】:
你想做什么?可能是您以错误的方式处理此问题。祝你好运! 【参考方案1】:一旦编译了应用程序,就没有变量名这样的东西,所以这个问题没有多大意义。在您的示例中,myVar
只是您(程序员)的一个方便标签,一旦您的源代码编译成二进制代码,它就不会以任何方式存在。
当您将一个对象放入一个 nib 文件中时,它会在运行时被归档然后取消归档。如果您希望能够获取对已存档在 nib 文件中的对象的引用,则需要使用 outlet,这意味着您在 nib 文件中存在的类中声明 IBOutlet
实例变量,并且然后将该插座连接到要在 Interface Builder 中引用的 nib 中的对象。实例变量与您在示例中声明的堆栈变量不同,可以在运行时引用。
通常,您会拥有一个“拥有”笔尖的对象。通常 nib 由 NSWindowController
或 NSViewController
的实例加载,并且窗口或视图控制器在 nib 文件中表示为 File's Owner。如果您在窗口/视图控制器中声明了出口,则可以将文件所有者的出口连接到 Interface Builder 中的对象。
因此,为了澄清,您需要从同一笔尖中的其他对象引用您笔尖中的对象。第二个对象在实例变量上使用IBOutlet
关键字声明了一个出口,如下所示:
@interface SomeOtherObject : NSObject
IBOutlet SomeObject* anObject;
@end
在 Interface Builder 中,您可以将SomeOtherObject
实例的anObject
出口连接到第一个SomeObject
实例。您可以通过控制从一个对象拖动到另一个对象来执行此操作,也可以在 Interface Builder 检查器的连接面板中执行此操作。
然后,您可以通过 SomeOtherObject
代码中的变量名称 anObject
引用您的 SomeObject
实例。
【讨论】:
【参考方案2】:在您的控制器类中实现awakeFromNib 方法 - 在 nib 完成加载后立即调用它,并且您的控制器实例可以在“self”变量中找到。
【讨论】:
【参考方案3】:@tedge(我无法对你的回答做出 cmets):
您能否为刚开始学习 Cocoa 的人澄清一下。学习 Apple 货币转换器教程。
我在现有的 ConverterController 类中实现了 awakeFromNib 方法。 (我很快就会学会做的事情!)
应用程序启动并自动实例化 ConverterController 的实例。
awakeFromNib 会告诉我关于该正在运行的实例的什么信息(除了它可以使用的情况)——以及“self”的什么语法让它泄露这些信息?
【讨论】:
【参考方案4】:...自定义控制器实例分配给的变量的名称是什么?
这是您在声明该变量时给它起的任何名称。
IB 不会为您创建变量。听起来您正在寻找outlet,这是您创建的一个变量,IB 知道并允许您将对象插入其中,从而设置该变量。
(您实际上可以从 IB 创建 outlet,在现代运行时,这应该真正创建 outlet,而不仅仅是在 nib 中声明一个不存在的 outlet。即使这样,你 创建出口 [in IB],你给它起个名字。)
【讨论】:
【参考方案5】:我认为 Nibbles 的困惑在于如何从代码中引用仅在 NIB 文件中定义的变量。
答案是,通常你在代码和 NIB 中有一个自定义控制器类(或委托类)A,如果你有另一个类或控制器 B 只在 NIB 中定义,只需在 A 中设置一个指向 B 的插座. 由于 A 可以在代码中的任何位置使用,因此 B 也可以通过 A 访问。
我也有这个问题。
【讨论】:
以上是关于Cocoa:NIB 文件创建的实例的 var 名称是啥?的主要内容,如果未能解决你的问题,请参考以下文章
Cocoa (Xcode 4),从另一个 NIB 更改一个 NIB 上的标签