实体模式下的 NSArrayController 在具有内容绑定的 NSTableView 被编辑后未更新
Posted
技术标签:
【中文标题】实体模式下的 NSArrayController 在具有内容绑定的 NSTableView 被编辑后未更新【英文标题】:NSArrayController in entity-mode not updating after NSTableView with content-binding has been edited 【发布时间】:2013-01-31 19:12:36 【问题描述】:我有一个配置了模式“实体”的 NSArrayController,其中包含选择的“人员”和“准备内容”类型的核心数据实体。所有其他属性都是默认属性。正如预期的那样,当我创建新的人实体(通过按钮单击)时,这个数组控制器会更新它的排列对象:
-(IBAction)addEntity:(id)sender
Person* new = [NSEntityDescription insertNewObjectForEntityForName:@"Person"
inManagedObjectContext:[self managedObjectContext]];
new.text = @"text";
new.date = [NSDate date];
我已将基于视图的 NSTableView 的内容绑定到此 arrayController 的“arrangedObjects”属性,以显示人员。在一列中,我有一个可编辑的(但默认情况下)NSTextField 绑定到 TableCellView 的“objectValue.text”属性。
如果我在表格中编辑“文本”属性并添加另一个人(当表格单元仍处于编辑模式时)表格失去焦点,编辑将结束,新人显示在表格中。一切看起来都很好。
但是,如果我想添加另一个人,arrayController 不会更新排列对象属性(我发现不再调用 arrayController 的 setContent:)。
这是预期的行为吗?
【问题讨论】:
【参考方案1】:我自己找到了答案。我注意到在我编辑表格后没有发送 NSManagedObjectContextObjectsDidChangeNotifications(就像他们之前所做的那样)。
link 为我指明了正确的方向。在我以以下方式修改了我的 addEntity 方法后,一切都按预期工作:
-(IBAction)addEintrag:(id)sender
Person* new = [NSEntityDescription insertNewObjectForEntityForName:@"Person"
inManagedObjectContext:[self managedObjectContext]];
new.name = @"test";
new.datum = [NSDate date];
[self.managedObjectContext processPendingChanges];
【讨论】:
【参考方案2】:如果您希望您的 arrayController 自动重新排列对象,请在 Interface Builder 中选中您的 arrayController 上的“自动重新排列内容”复选框或以编程方式使用 setAutomaticallyRearrangesObjects:
。
【讨论】:
我试过了,但这并不能解决问题。据我所知,这只有在我有 sortdescriptors 或 filter-predicates 时才会起作用。在我的例子中,arraycontroller 的更新是由初始设置 setAutomaticallyPreparesContent: 触发的。在我编辑表格后它仍然处于活动状态。以上是关于实体模式下的 NSArrayController 在具有内容绑定的 NSTableView 被编辑后未更新的主要内容,如果未能解决你的问题,请参考以下文章
两个 NSArrayController 和一个关系(CoreData)
NSArrayController,以编程方式创建 CoreData 实体,以及 KVO
核心数据遍历具有 NSArrayController 内容集的实体?
Cocoa Mac 应用程序和 NSTableView 不使用 NSArrayController 和 NSManagedObjectContext 刷新