2009-12-28 40 views
0

我有以下代码:为什么只有一个文本字段的值发生变化?

@interface AXWindowController : NSWindowController { 
IBOutlet NSTextField *text; 
IBOutlet NSTextField *otherText; 
} 

- (void) setText: (NSString *)input; 
- (void) setOtherText; 

@end 

@implementation AXWindowController 

- (void) setText: (NSString *)input 
{ 
    [text setStringValue:input]; 
} 

- (void) setOtherText 
{ 
    [otherText setStringValue:@"nag"]; 
} 

@end 

当我运行:

1. [controller showWindow:nil]; 
2. [controller setText:@"lol"]; 
3. [controller setOtherText]; 

3号线正确地执行,但2号线什么都不做。事实上,当我看着文字和otherText在gdb在执行线2和3,我得到如下结果:

(gdb) p text 
$1 = (NSTextField *) 0x0 
(gdb) p otherText 
$2 = (NSTextField *) 0x1385d1e0 

这是怎么回事?我无法将输入变量传递给NSTextField的设置函数?为什么当我更改set函数的参数时,NSTextField会变为空?

+0

这是没有问题的,但你可能不应该命名文本框之类的东西'text'。这个名字应该指向一个模式对象,就像'NSString'一样。 – 2009-12-28 22:52:54

+0

你说得对,但我只是在测试它。 – Chetan 2009-12-28 22:57:18

+0

此外,您的问题与NSWindowController无关。我改变了问题的标题来描述事实,而不是你的假设。 – 2009-12-29 00:33:09

回答

4

这是众所周知的KVC问题。

当Cocoa加载您的NIB连接IB设计的插座连接时,它会寻找setter。 因此,它在加载时调用setText:与NSTextField *对象。 由于您的代码尚未准备好接受不同类型的对象...第一个用于配置插座,第二个用于设置其内部文本值...您的插座将保持等于

所有调用为零 - 什么都不做。

解决方法:重命名出口变量名称或重命名的setter/getter方法是从KVC符号不同...

+0

啊,你说得对。他们确实应该解决这个问题,或者明确表示在这种情况下我们不应该使用'setVARIABLENAME'表示法。 – Chetan 2009-12-28 23:22:34

+0

我想也一样......但经过一番审查,我决定他们是绝对正确的: 虽然** setText:** - 用于设置文本变量本身, ** setTextValue:** - 用于配置文本变量的内部状态... – UncleMiF 2009-12-28 23:35:48

1

为了获得烦人的,明显的反应,你确定你已经在Interface Builder中连接了IBOutlet?你什么时候设置文本行 - 你在-awakeFromNib中执行它?

+0

我已经在Interface Builder中连接了IBOutlet;我尝试将文件的所有者连接到文本字段,然后添加一个对象,将其设置为AXWindowController,并将其连接到文本字段。两种产品都有相同的结果。我正在设置另一个函数的文本行,而不是-awakeFromNib。 – Chetan 2009-12-28 22:52:35

+0

而最奇怪的部分是,如果我删除参数'input',并将'text'设置为预定义值,问题就会消失。添加一个'NSString'参数,甚至不使用它,会导致这个问题。请帮忙! – Chetan 2009-12-28 23:03:55

+0

如果不在-awakeFromNib中,你什么时候调用试图更改文本的方法?只是试图确保你没有试图在设置之前使用插座。 – 2009-12-29 19:17:54

相关问题