NSArrayController 绑定到 NSTableView 中的一对多关系
Posted
技术标签:
【中文标题】NSArrayController 绑定到 NSTableView 中的一对多关系【英文标题】:NSArrayController binding to One-To-Many relationship in a NSTableView 【发布时间】: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”选项:无];现在它起作用了!谢谢! 【参考方案1】:表格视图一旦绘制就不会刷新。您需要在表格视图上显式调用reloadData
。 [yourTableView reloadData];
设置属性后。
另一种做同样事情的方法是:在将属性添加到描述之后,也将属性添加到arrayController。 [self.controller addObject:property];
它将对象附加到 tableView 并且不需要刷新。
如果不起作用,(不推荐的方法)重置 tableView 的内容。
[self.controller setContent:self.descriptionObject.properties];
【讨论】:
那么现在有办法自动触发 NSTableView 刷新吗?当我使用 NS(Mutable)Array 作为我的数组控制器的内容时,我很确定我曾经设法做到这一点。我也会尝试将该对象添加到我的收藏中,但是……嗯。 如果您只添加到数组对象,则需要重新加载 NSTableView 的数据。 NSArrayController 将在内部处理该部分。 不是现在我使用绑定,而是 +1 回答 :)【参考方案2】:感谢 Duncan Groenewald,我做了以下事情:我停止使用 initWithContent: 并将我的属性集绑定到我的 ArrayController 的 NSContentSet :
self.controller = [[NSArrayController alloc] init];
[self.controller bind: NSContentSetBinding toObject: self.apiDescription withKeyPath: @"properties" options: nil];
然后,在我的 addProperty: 方法中,我要做的就是反转我将新属性添加到描述之一的方式:
property.descriptionObject = self.descriptionObject;
【讨论】:
以上是关于NSArrayController 绑定到 NSTableView 中的一对多关系的主要内容,如果未能解决你的问题,请参考以下文章
NSArrayController 绑定到核心数据可以在后台线程中运行获取吗?
绑定到 NSArrayController 的 core-plot 条形图
NSArrayController NSTableView 核心数据绑定整数
NSArrayController 绑定到 NSTableView 中的一对多关系