NSArray在更改时丢失一个值

时间:2013-10-16 23:41:43

标签: objective-c nsmutablearray

我正在尝试在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”

发生了什么事?

1 个答案:

答案 0 :(得分:1)

NSText string方法状态的文档(重点已添加):

  

出于性能原因,此方法返回文本对象的当前后备存储。 如果您想在操作文本存储时维护此快照,则应复制相应的子字符串。

这意味着您放置在数组中的对象会不断更新并跟踪文本视图的内容。

尝试:

[self.array replaceObjectAtIndex:selectedSegment withObject:newText.string.copy];