我有一个基于文档的应用程序,由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”的相同值,这意味着相同的值以某种方式被写入所有模型对象。我该怎么调试呢?
答案 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:]也足够了,但我还没有检查过。