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 中的一对多关系

将表示一对多关系的 NSSet 绑定到 NSArrayController 的选择

NSArrayController 返回 null