3

我正在使用实体“客户”和属性“名称”测试一个简单的核心数据项目。我正在使用主从模板的修改版本;Master包含名称的tableview,detail用于输入名称。

在 Master 的 prepareForSegue 中,我将 Details 的 Customer 对象设置如下:

...
else if ([segue.identifier isEqualToString:@"Add Customer"]) {
    [[segue destinationViewController] setDelegate:self];
    [[segue destinationViewController] setCust:(Customer *) [NSEntityDescription insertNewObjectForEntityForName:@"Customer"inManagedObjectContext:self.managedObjectContext]];
}

Master的insertNewObject添加了一个通用名称:

...
[newManagedObject setValue:sender forKey:@"name"];
...

详细来说,名称是通过委托添加的:

- (IBAction)save:(UIBarButtonItem *)sender {
self.cust.name = self.customerName.text;
[self.delegate addNameController:self selectedSave:YES];  

Master的委托方法:

- (void)addNameController:(AddNameController *)controller selectedSave:(BOOL)save {
if (!save) {
    [self.managedObjectContext deleteObject:controller.cust];
}
NSError *error = nil;
if (![self.managedObjectContext save:&error]) {
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}
[self dismissViewControllerAnimated:YES completion:nil];}

这一切都很好,并且 tableview 为所有新名称条目正确更新,除了任何条目,排序明智,成为第一个条目。在这种情况下,虽然名称添加到数据库中,但在 tableview 的第一行中放置了一个空白条目。我可以通过点击“编辑”按钮或添加一个新名称来显示该名称,该名称排序在不可见名称之前。

为了解决这个问题,我强制在 Master 中重新加载:

- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.tableView reloadData];}

这对我来说似乎有点骇人听闻。据我了解,Core Data 将负责正确更新显示以响应任何内容更改。

我的实现方式是否存在问题,或者这是 Core Data 的特质?

谢谢。

4

1 回答 1

1

实际上,必须显式更新该表,除非您有一个链接到NSFetchedResultsController delegate您执行此操作的位置的方法。(委托方法是controllerDidChangeContent:。)

一种更方便和明显的方法是在关闭详细视图时在您的主代理回调中正确执行此操作。这不是“黑客”。

于 2012-06-08T23:39:14.760 回答