我正在使用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但没有成功。
知道为什么吗? 谢谢!
答案 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;