我正在尝试在Mac应用中做一些非常简单的事情,并且遇到令人沮丧的问题。
我有一个带有5个项目的NSPopUpButton,一个NSTextView和一个带有五个字符串的NSMutableArray。弹出按钮选择更改后,相应的字符串将显示在文本视图中。当文本视图文本更改时,数组中的相应字符串也会更改。
一些代码:
在初始化代码中:
self.array = [NSMutableArray arrayWithObjects:@"string 1", @"string 2", @"string 3", @"string 4", @"string 5", nil];
在视图正文中:
-(void)popUpChanged:(id)sender {
NSInteger index = [sender indexOfSelectedItem];
NSString *string = [self.array objectAtIndex:index];
self.textView.string = string;
NSLog(@"Selected string: %@", string);
}
-(void)textDidChange:(NSNotification *)notification {
NSInteger selectedSegment = self.popUp.indexOfSelectedItem;
NSText *newText = notification.object;
[self.array replaceObjectAtIndex:selectedSegment withObject:newText.string];
NSLog(@"New string: %@", newText.string);
}
问题: 选择PopUp项目0,在textView中显示“string 1”。
TextView更改为“string 100”
选择了PopUp项目4,textView中显示“string 5”。
再次选择PopUp项目0。 TextView显示“string 5”,但应显示“string 100”。
(NSLogs显示该字符串在textDidChange:
中已正确更改,但已在popUpChanged:
中更改为“字符串5”
发生了什么事?
答案 0 :(得分:1)
NSText
string
方法状态的文档(重点已添加):
出于性能原因,此方法返回文本对象的当前后备存储。 如果您想在操作文本存储时维护此快照,则应复制相应的子字符串。
这意味着您放置在数组中的对象会不断更新并跟踪文本视图的内容。
尝试:
[self.array replaceObjectAtIndex:selectedSegment withObject:newText.string.copy];