可可文本字段返回null



对不起,如果它有点长,但我想尽可能描述。我正在用几个类和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,这样,当anInstance初始化时,MyClass的init方法会这样做:

- (id)init {
if ( self = [super init] )   {
    [self setName:[nameInput stringValue]];
    NSLog(@"init value: %@", name);
}
return self;

"NameInput"是文本字段。我认为这将返回文本字段中的任何内容,但我得到null代替。当我使用setName:@"text"时,它通过得很好,所以文本字段有问题。

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

- (NSString *)name {
NSLog(@"nameMethod = %@", [nameInput stringValue]);
return [[[nameInput stringValue] retain] autorelease];

这样,我可以告诉它是正确设置,但有些事情发生时,我从ViewClass初始化MyClass,并试图获得"名称",它一直说文本字段为空。

不确定是否有帮助,但nib与按钮属于MyView(这是NSViewController的子类)和文本字段属于MyClass (NSObject的子类)。

有人建议该字段没有正确链接,但如果这是真的,它不会在从它自己的类调用时工作,但它做到了。有人提到,这可能是一个问题与文本域被初始化为nil,所以我尝试了init上面的东西。到目前为止,这两种方法都没有成功。

谢谢你的帮助

IBOutlets不能保证在awakeFromNib之前被连接起来,这是在对象的init方法运行之后。您需要在awakeFromNib中进行笔尖设置。

现在我已经到家了:对不起,我之前没有足够仔细地阅读。我上面说的是对的,但还有一个更深层次的问题。我现在看到你也在处理两个不同的对象一个在笔尖中,一个在代码中创建。如果你在nib中有一个对象,其出口连接到一个接口元素,那不会使该类的其他对象也有一个引用该元素的实例变量。两个独立创建的MyClass实例不会共享相同的实例变量,就像程序中的每个NSArray都不会保存相同的一组项一样。如果你想使用nib中的实例,你需要使用那个实例。

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

当您尝试从同一对象的字段中提取值时,您正在init例程中,并且显然希望将其初始化。这是不可能的

最新更新