对不起,如果它有点长,但我想尽可能描述。我正在用几个类和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
中进行笔尖设置。
如何做到这一点取决于你如何构建你的程序。没有简单的[self magicallyGetObjectFromNib]
。不知何故,一个对象需要找到另一个对象(比如,通过知道nib的所有者),或者被一个同时知道它们的对象告知另一个对象。
当您尝试从同一对象的字段中提取值时,您正在init例程中,并且显然希望将其初始化。这是不可能的