Core Data和NSArrayController非常奇怪的行为

时间:2011-05-22 19:13:26

标签: cocoa core-data nstableview nsarraycontroller

我有一个基于文档的应用程序,由Core Data提供内存存储。我有一个由NSArrayController支持的表,它假定列出Buffer类型的所有模型对象。我的UI还包括一个NSTextView,它从当前选定的Buffer对象中获取数据。

我尝试填充文本视图(我正在使用Fragaria):

- (void)tableViewSelectionDidChange:(NSNotification *)aNotification
{
    if ([aNotification object] == editorList) {
        Buffer *buffer = [[editorListArrayController selectedObjects] objectAtIndex:0];
        [fragaria setString:[buffer valueForKey:@"content"]];
    }
}

现在,只要用户在文本视图中键入内容,我就将其保存到当前选定的缓冲区中,然后将更改保存到托管对象上下文中:

- (void)textDidChange:(NSNotification *)notification
{
    Buffer *buffer = [[editorListArrayController selectedObjects] objectAtIndex:0];
    [buffer setValue:[fragaria string] forKey:@"content"];
    [[self managedObjectContext] saveChanges];
    [self setEditedFlagForModelAndWindow:YES];
}

我的问题是,当我列出我的NSArrayController中的所有模型对象时,它们似乎都具有@“content”的相同值,这意味着相同的值以某种方式被写入所有模型对象。我该怎么调试呢?

1 个答案:

答案 0 :(得分:1)

幸运的是,我前段时间遇到了同样的问题。

问题在于你的任务:

[buffer setValue:[fragaria string] forKey:@"content"];

[fragaria string]返回指向可变字符串的指针。 NSTextView中的每个编辑都会更新相同的NSMutableString对象,导致所有缓冲区对象在没有通知的情况下进行更改。

以下代码有效:

NSString *result = [NSString stringWithFormat:@"%@", [fragaria string]];
[buffer setValue:result forKey:@"content"];

[NSString stringWithString:]也足够了,但我还没有检查过。