带有核心数据的 Cocoa 绑定不更新所有列

Posted

技术标签:

【中文标题】带有核心数据的 Cocoa 绑定不更新所有列【英文标题】:Cocoa Bindings with Core Data not updating all columns 【发布时间】:2012-08-12 03:09:41 【问题描述】:

我遇到了一个奇怪的问题,我将 NSArrayController 绑定到 managedObjectContext 并使用数组控制器填充 NSTableView。我可以创建一个对象并插入它,它将添加新对象并更新绑定到控制器的列之一,而不是其他列!我知道正在设置字段并且绑定工作正常(也许),因为如果我关闭应用程序并重新启动应用程序,所有内容都会正确填充。

我不确定我错过了什么!如何调试绑定?从我在这里找到的: https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdTroubleshooting.html#//apple_ref/doc/uid/TP40002320-SW6 它基本上只是说可能是您的控制器或键值编码合规性。

这是创建实体的代码:

NSManagedObjectContext* context = [[BugManager shared] managedObjectContext];
NSError* error;
Bug* newBug = [NSEntityDescription insertNewObjectForEntityForName:@"Bug" inManagedObjectContext:context];
[newBug setValuesForKeysWithDictionary:data];
[context save:&error];

我已验证所有字段均已正确设置并已保存。我还尝试显式设置值,以查看它是否是关键值观察问题,但无济于事。

这是正确更新的列:

这是一个没有正确更新的:

还有数组控制器:

我可以重新排列表格列,它仍然只更新一个,即目标字段(它之前更新的那个)。我只想让表格正确更新所有列,但这比预期的要困难!

【问题讨论】:

【参考方案1】:

在我的头撞到墙上几个小时后,我发现问题不是绑定是如何设置的(因为它是正确的),而是我的数据是如何创建的。在我用来填充对象的表单中,我有一个文本字段和一个文本视图。文本字段工作正常,但文本视图没有。当我切换到尝试两者的文本字段时,它也可以正常工作。或者,如果我对字符串文字进行硬编码,则绑定会正确更新。我的解决方法是从文本视图中创建一个明确的NSString*。如果你要求它的字符串,它会因为某种原因给我一个NSBigMutableString,用它设置核心数据字段并没有触发通知。

所以我这样做了:

NSString* description = [[NSString alloc] initWithString:[[[self descriptionField] textStorage] string]];

然后我将该字符串值用于我的实体,一切正常。

【讨论】:

以上是关于带有核心数据的 Cocoa 绑定不更新所有列的主要内容,如果未能解决你的问题,请参考以下文章

Cocoa Binding 仅用于检索

使用跨越多个实体的核心数据绑定在 Cocoa 中实现父->子向下钻取

Cocoa-Touch – 更新多对多关系的核心数据

核心数据模板:运行之间不持久的数据

Cocoa:如何避免核心数据重复关系?

在标签可可中显示时间总和