NSArrayController绑定到NSTableView中的一对多关系

时间:2014-02-26 02:57:36

标签: cocoa core-data cocoa-bindings nsarraycontroller

我正在使用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但没有成功。

知道为什么吗? 谢谢!

2 个答案:

答案 0 :(得分:2)

一旦绘制,表格视图将不会刷新。您需要在表视图中显式调用reloadData。设置属性后[yourTableView reloadData];

执行相同操作的另一种方法是:在将属性添加到description之后,还将属性添加到arrayController。 [self.controller addObject:property];它会将对象附加到tableView,不需要刷新。

如果无效,(不推荐的方法)重置tableView的内容。

[self.controller setContent:self.descriptionObject.properties];

答案 1 :(得分:1)

感谢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;