很抱歉,如果它有点长,但我希望尽可能具有描述性。 我正在制作一个带有几个类和两个nib文件的测试应用程序(每个类都是一个nib的所有者)。其中一个nib文件有一个文本字段,另一个有一个按钮。当我按下另一个笔尖视图中的按钮时,我正在尝试记录文本字段内的任何内容,但它返回(null)。在其中一个类(ViewClass)中,我有这个:
- (IBAction)startAction:(id)sender {
MyClass *anInstance = [[MyClass alloc] init];
NSString *string= [anInstance name];
NSLog(@"startAction logged: %@", string);
“名称”是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并尝试获取“名称”时会发生一些事情,它一直说文本字段为空。
不确定它是否有帮助,但带按钮的笔尖属于MyView(它是NSViewController的子类),而textfield属于MyClass(NSObject的子类)。
有人建议该字段没有正确链接,但如果这是真的,那么从它自己的类调用它时就不会有效,但确实如此。有人提到它可能是一个问题,文本字段被初始化为nil,所以我尝试了上面的init事件。到目前为止,两者都没有奏效。
感谢您的帮助。
答案 0 :(得分:5)
在awakeFromNib
之后,不保证IBOutlets可以连接,这是在对象的init方法运行之后。您需要在awakeFromNib
中进行笔尖设置。
现在编辑我已经回家了:对不起,我之前没有仔细阅读过。我上面所说的是真的,但也有更深层次的问题。我现在看到你也在处理两个不同的对象 - 一个在nib中,一个在代码中创建。如果nib中的对象具有连接到接口元素的出口,则不会使该类的其他对象也具有引用该元素的实例变量。两个独立创建的MyClass实例不会共享相同的实例变量,只是程序中的每个NSArray都包含相同的项集。如果要使用nib中的实例,则需要使用 实例。
如何执行此操作取决于您如何构建程序。没有简单的[self magicallyGetObjectFromNib]
。不知何故,一个对象需要找到另一个(比如通过知道笔尖的所有者)或者通过一个知道它们的对象告诉另一个对象。
答案 1 :(得分:0)
当您尝试从同一对象中的字段中提取值时,您处于init例程中,并且显然希望将其初始化。 “不会发生。”