【发布时间】:2014-02-26 02:57:35
【问题描述】:
我正在使用 Core Data 开发一个应用程序。我的模型基本上是一个对象列表,称为“描述”。每个描述都有一个“属性”列表。这是一个非常简单的一对多关系。我有一个包含 2 列的 NSTableView。
我正在使用绑定来用我的属性列表填充我的表格视图:
self.controller = [[NSArrayController alloc] initWithContent: self.descriptionObject.properties];
NSTableColumn *propertyColumn = [self.propertiesTableView tableColumnWithIdentifier: @"property_column"];
[propertyColumn bind: NSValueBinding toObject: self.controller withKeyPath: @"arrangedObjects.name" options: nil];
NSTableColumn *infoColumn = [self.propertiesTableView tableColumnWithIdentifier: @"info_column"];
[infoColumn bind: NSValueBinding toObject: self.controller withKeyPath: @"arrangedObjects.info" options: nil];
我有一个按钮调用我的“addProperty”方法:
- (IBAction)addProperty:(id)sender {
NSLog(@"Add a new property");
PCSDescriptionProperty *property = [PCSDescriptionProperty insertInManagedObjectContext: self.storage.managedObjectContext];
property.name = @"New property";
property.info = @"New property info";
[self.descriptionObject addPropertiesObject: property];
}
问题是,调用addPropertiesObject: 不会触发KVO 通知,我的tableview 也不会刷新。我尝试在 addPropertiesObject 之前和之后调用 willChangeValueForKey/didChangeValueForKey ,但没有成功。
知道为什么吗? 谢谢!
【问题讨论】:
-
尝试设置 property.description = self.descriptionObject 而不是将属性添加到描述对象。还要确保您正确设置了这两种关系。我会将 ArrayController 实体设置为 @"Property",将其 managedObjectContext 设置为 managedObjectContext,并将其 contentSet 设置为 description.properties。这就是你在 IB 中的做法。
-
实际上这种关系是有效的,因为我可以看到保存的更改,实际上是 NSArrayController 的内容没有“重新获取”。
-
对于多对多关系,您仍应将 contextSet 绑定到 descriptionObject.properties。不要使用 initWithContent。
-
这是我添加的:self.controller = [[NSArrayController alloc] init]; [self.controller 绑定:NSContentSetBinding toObject:self.descriptionObject withKeyPath:@“properties”选项:无];现在它起作用了!谢谢!
标签: cocoa core-data cocoa-bindings nsarraycontroller