Elb*_*mio 0 methods cocoa class objective-c textfield
对不起,如果它有点长,但我希望尽可能具有描述性.我正在制作一个带有几个类和两个nib文件的测试应用程序(每个类都是一个nib的所有者).其中一个nib文件有一个文本字段,另一个有一个按钮.当按下另一个笔尖视图中的按钮时,我正在尝试记录文本字段内的任何内容,但它返回(null).在其中一个类(ViewClass)中,我有这个:
- (IBAction)startAction:(id)sender {
MyClass *anInstance = [[MyClass alloc] init];
NSString *string= [anInstance name];
NSLog(@"startAction logged: %@", string);
Run Code Online (Sandbox Code Playgroud)
"名称"是MyClass的属性.我想要做的是在MyClass的init中设置"name",这样,当anInstance初始化时,MyClass init方法执行此操作:
- (id)init {
if ( self = [super init] ) {
[self setName:[nameInput stringValue]];
NSLog(@"init value: %@", name);
}
return self;
Run Code Online (Sandbox Code Playgroud)
"NameInput"是文本字段.我认为这将返回文本字段中的任何内容,但我得到null.当我使用setName:@"text"它时,传递得很好,因此文本字段出了问题.
我之前用自己的getter做过这个,在那种情况下,当从它自己的类调用该方法时它没有返回null,但是如果它是从其他类初始化并调用的,那么它返回null,我用了这个:
- (NSString *)name {
NSLog(@"nameMethod = %@", [nameInput stringValue]);
return [[[nameInput stringValue] retain] autorelease];
Run Code Online (Sandbox Code Playgroud)
通过这种方式,我可以说它已经完全正确设置了,但是当我从ViewClass初始化MyClass并尝试获取"名称"时会发生一些事情,它一直说文本字段为空.
不确定它是否有帮助,但带按钮的笔尖属于MyView(它是NSViewController的子类),textfield属于MyClass(NSObject的子类).
有人建议该字段没有正确链接,但如果这是真的,那么从它自己的类调用它时就不会有效,但确实如此.有人提到它可能是一个问题,文本字段被初始化为nil,所以我尝试了上面的init事件.到目前为止,两者都没有奏效.
谢谢您的帮助.
IBOutlets不保证awakeFromNib在您的对象的init方法运行之后被连接起来.您需要进行笔尖设置awakeFromNib.
编辑现在我已经回家了:对不起,我之前没有仔细阅读过.我上面所说的是真的,但也有更深层次的问题.我现在看到你也在处理两个不同的对象 - 一个在nib中,一个在代码中创建.如果nib中的对象具有连接到接口元素的出口,则不会使该类的其他对象也具有引用该元素的实例变量.两个独立创建的MyClass实例不会共享相同的实例变量,只是程序中的每个NSArray都包含相同的项集.如果要使用nib中的实例,则需要使用该实例.
你如何做到这一点取决于你如何构建你的程序.没有简单的[self magicallyGetObjectFromNib].不知何故,一个对象需要找到另一个(比如通过知道笔尖的所有者)或者通过一个知道它们的对象来告诉另一个对象.