Objective c Cocoa文本字段返回null

Objective c Cocoa文本字段返回null,objective-c,cocoa,class,methods,textfield,Objective C,Cocoa,Class,Methods,Textfield,抱歉,如果有点长,但我希望尽可能描述。 我正在用几个类和2个nib文件制作一个测试应用程序(每个类拥有一个nib)。其中一个nib文件有一个文本字段,另一个有一个按钮。当按下另一个nib视图中的按钮时,我试图记录文本字段中的内容,但它返回(null)。在其中一个类(ViewClass)中,我有: - (IBAction)startAction:(id)sender { MyClass *anInstance = [[MyClass alloc] init]; NSString *string=

抱歉,如果有点长,但我希望尽可能描述。 我正在用几个类和2个nib文件制作一个测试应用程序(每个类拥有一个nib)。其中一个nib文件有一个文本字段,另一个有一个按钮。当按下另一个nib视图中的按钮时,我试图记录文本字段中的内容,但它返回(null)。在其中一个类(ViewClass)中,我有:

- (IBAction)startAction:(id)sender {
MyClass *anInstance = [[MyClass alloc] init];
NSString *string= [anInstance name];
NSLog(@"startAction logged: %@", string);
“Name”是MyClass的一个属性。我想做的是在MyClass的init中设置“name”,这样,当初始化一个实例时,MyClass init方法会执行以下操作:

- (id)init {
if ( self = [super init] )   {
    [self setName:[nameInput stringValue]];
    NSLog(@"init value: %@", name);
}
return self;
“NameInput”是文本字段。我以为这会返回textfield中的任何内容,但我得到了null。当我使用
setName:@“text”
时,它可以很好地传递,因此文本字段有问题

我以前是用自己的getter实现的,在这种情况下,当从自己的类调用方法时,它不会返回null,但是如果它是从另一个类初始化和调用的,那么它会返回null,我使用以下方法:

- (NSString *)name {
NSLog(@"nameMethod = %@", [nameInput stringValue]);
return [[[nameInput stringValue] retain] autorelease];
通过这种方式,我可以判断所有设置是否正确,但是当我从ViewClass初始化MyClass并尝试获取“name”时,发生了一些事情,它一直在说文本字段为null

不确定是否有帮助,但带按钮的nib属于MyView(它是NSViewController的子类),textfield属于MyClass(NSObject的子类)

有人建议该字段没有正确链接,但如果这是真的,当从它自己的类调用时,它不会工作,但它确实工作了。其他人提到,将textfield初始化为nil可能有问题,所以我尝试了上面的init方法。到目前为止,两者都没有奏效


感谢您的帮助。

在对象的init方法运行之后,在
唤醒NIB
之前,不能保证连接IBoutlet。您需要在
awakeFromNib
中进行nib设置

回家后立即编辑:对不起,我以前读得不够仔细。我上面说的是真的,但还有一个更深层次的问题。我现在看到您也在处理两个不同的对象——一个在nib中,一个在代码中创建。如果nib中有一个对象,其出口连接到接口元素,则该类的其他对象也不会有引用该元素的实例变量。两个独立创建的MyClass实例不共享相同的实例变量,就像程序中的每个NSArray都包含相同的项集一样。如果要使用nib中的实例,则需要使用该实例


你如何做到这一点取决于你如何构建你的程序。没有简单的
[self magicallyGetObjectFromNib]
。不知何故,一个对象需要找到另一个对象(比如,通过了解nib的所有者),或者由一个同时了解这两个对象的对象告知另一个对象。

只有在对象的init方法运行之后,
唤醒nib
,才能保证连接IBoutlet。您需要在
awakeFromNib
中进行nib设置

回家后立即编辑:对不起,我以前读得不够仔细。我上面说的是真的,但还有一个更深层次的问题。我现在看到您也在处理两个不同的对象——一个在nib中,一个在代码中创建。如果nib中有一个对象,其出口连接到接口元素,则该类的其他对象也不会有引用该元素的实例变量。两个独立创建的MyClass实例不共享相同的实例变量,就像程序中的每个NSArray都包含相同的项集一样。如果要使用nib中的实例,则需要使用该实例


你如何做到这一点取决于你如何构建你的程序。没有简单的
[self magicallyGetObjectFromNib]
。不知何故,一个对象需要找到另一个对象(比如,通过了解nib的所有者),或者由一个同时了解这两个对象的对象告知另一个对象。

当您尝试从同一个对象的字段中提取值时,您正处于初始化例程中,并且显然希望它被初始化。”这不会发生。

当您试图从同一对象的字段中提取值时,您正处于初始化例程中,并且显然希望它被初始化。”这不会发生。

我将init中的内容移到了awakeFromNib中,现在我不需要自己的getter方法。但这仍然只在ViewClass中使用时有效,我尝试使*anInstance=(…);[从NIB中唤醒的立场];但是当从其他类调用它时,它仍然返回null。我遇到的真正问题是让ViewClass告诉MyCLass在textfield中返回名称字符串。但是谢谢你的帮助@Chuck。我想我明白你的意思了,我不只是在不同的时间添加一个立场,我会尝试实际制作几个独立的对象,它们都加载相同的内容nib@Elbimio:不,您不想让它们一次又一次地加载笔尖。这将实例化nib中对象的多个副本,这些副本也不同于用户正在交互的副本。你想得到一个你已经创建的引用。我一直在尝试,但我还没有弄明白。我不知道如何让一个对象找到另一个,我将init中的内容移到了awakeFromNib中,现在我不需要自己的getter方法。但这仍然只在ViewClass中使用时有效,我尝试使*anInstance=(…);[从NIB中唤醒的立场];但是当从其他类调用它时,它仍然返回null。我遇到的真正问题是让ViewClass告诉MyCLass在textfield中返回名称字符串。但是感谢@Chuck的帮助。我想我理解你的意思,我不会只是多次添加一个立场,而是尝试实际制作几个独立的对象,它们都加载相同的笔尖@