2011-05-15 63 views
0

所以,这是我以前的问题的后续行动。我遇到了一个奇怪的错误,无法弄清楚什么是错的。从本质上讲,我写了下面的代码,以检测当文本在文本框中输入了,并相应地更改变量:变量神秘地被改变

-(void)controlTextDidChange:(NSNotification *)aNotification 
{ 
    NSTextView *fieldEditor = [[aNotification userInfo] objectForKey:@"NSFieldEditor"]; 

    if ([[aNotification object] isEqualTo:[self idField]]) 
    { 

     [self setIdNumber:[[fieldEditor textStorage] string]]; 
    } 
    else if ([[aNotification object] isEqualTo:[self chapterField]]) 
    { 

     [self setChapterNumber:[[fieldEditor textStorage] string]]; 

    } 

} 

这需要输入的文本,检查该文本框正在编辑,并改变取决于一个变量在哪个盒子上编辑。问题在于,“else if ..”代码块将变量chapterNumber和IdNumber都更改为输入的文本,即使只有用于更改chapterNumber的代码。我只是无法弄清楚什么是错的...

+0

检查您的IBOutlet连接?如图所示,没有任何问题。你在哪里以及如何检查这两个变量的值? – 2011-05-15 06:41:12

+0

IBOutlets似乎连接正确。我在检查变量的值之前和之后立即使用NSLog语句,这是我如何隔离这部分代码的变化。 – Daniel 2011-05-15 22:38:39

+0

所以,我似乎已经找出了这个问题,但我不确定为什么这样工作。基本上,我改变了设置语句,以使用NSString的方法StringWithString ... – Daniel 2011-05-27 05:43:37

回答

1

您遇到了这个问题,因为您的两个setter方法setIdNumber:setChapterNumber:未复制字段编辑器中的字符串,而只是指向它。

如您所知,字段编辑器是NSTextView,该字段编辑器可以被当前正好关注的文本字段重新使用。它始终是同一个对象,并且该对象的string根据它所连接的文本字段而发生更改。

将变量分配给字段编辑器的string时,您正在分配指针;无论您现在分配哪个变量,都有该字符串的地址。由于字段编辑器始终是同一个对象,因此即使内容更改,字符串的地址也会保持不变,因此您拥有的任何指针(您分配了该字符串的任何变量)都会显示为更改其字符串值。

如果您使用copystringWithString:或其他方式使用内容字段编辑器的字符串,一个字符串,那么你会得到一个新的对象,在地址字段编辑器不能改变,并且无论场编辑器发生什么情况,您已经为其分配了这样一个副本的每个变量都将继续产生复制字符串中的值。