【问题标题】:Cocoa textfield returning null可可文本字段返回 null
【发布时间】:2011-10-22 21:05:03
【问题描述】:

对不起,如果它有点长,但我想尽可能描述。 我正在制作一个包含几个类和 2 个 nib 文件的测试应用程序(每个类都是一个 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 中设置“名称”,这样,当初始化 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 的子类),而文本字段属于 MyClass(NSObject 的子类)。

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

感谢您的帮助。

【问题讨论】:

    标签: objective-c cocoa class methods textfield


    【解决方案1】:

    直到awakeFromNib 才能保证连接IBOutlets,这是在您的对象的init 方法运行之后。您需要在awakeFromNib 中进行笔尖设置。

    现在我已经回家编辑:抱歉,我之前没有仔细阅读。我上面说的是真的,但还有一个更深层次的问题。我现在看到您也在处理两个不同的对象——一个在 nib 中,一个在代码中创建。如果您在 nib 中有一个对象,其插座连接到接口元素,则不会使该类的其他对象也具有引用该元素的实例变量。两个独立创建的 MyClass 实例不会共享相同的实例变量,就像程序中的每个 NSArray 都拥有相同的项目集一样。如果你想使用 nib 中的实例,你需要使用 那个 实例。

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

    【讨论】:

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

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

    【讨论】:

    • 将它移到 awakeFromNib 仍然没有解决从其他类调用时它不起作用的问题。
    • 对象实例是否甚至连接到您要访问的字段?我猜不是。检查你引用它的nameInput——我敢打赌它是零。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    • 2021-10-29
    • 2019-08-06
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多