0

我正在尝试使用从我的应用程序中的核心数据加载的联系人列表制作一个表格视图。

我正在使用 NSFetchedResultsController。

在启动应用程序时,我从通讯录中提取联系人并将它们添加到 Core Data。这样我就可以独立于地址簿管理联系人。在创建联系人对象时,我有一个 create 方法,其中包括以下代码:

contact = [NSEntityDescription insertNewObjectForEntityForName:@"Contact" inManagedObjectContext:context];
contact.name = name;
NSString *initial = [name substringToIndex:1];
NSString *capitalisedInitial = [initial capitalizedString];
contact.nameInitial = capitalisedInitial;

这会将联系人的第一个字母保存到联系人对象的属性中。

在我的表视图控制器代码中,我设置了 NSFetchedResultsController 如下

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Contact"];
NSSortDescriptor *descriptor1 = [NSSortDescriptor sortDescriptorWithKey:@"nameInitial" ascending:YES];
NSSortDescriptor *descriptor2 = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)];
request.sortDescriptors = [NSArray arrayWithObjects:descriptor1, descriptor2, nil];
self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:self.contactsDatabase.managedObjectContext sectionNameKeyPath:@"nameInitial" cacheName:nil];

我的问题仅在我第一次运行应用程序时出现(从设备中删除应用程序后)。当我打开应用程序后直接打开联系人页面时,它显示一个完全空白的表格,并且在任何时候都不会刷新。如果我关闭应用程序(而不是删除)并重新启动它,表就可以正常工作。

另一个奇怪的是,在上面的最后一行代码中,如果我删除 @"nameInitial" 并使用 nil 代替 sectionNameKeyPath,一切正常,没有故障。但是我真的很想拥有这些部分,因为用户期望添加的快捷方式的字母列。

我想这与数据库未准备好或表首次加载时有关,但我认为这些获取的结果控制器应该监听数据库的更新并在准备好时进行相应的更新?

任何想法真的很感激......

编辑:

一些进一步的信息:

在第一次加载 numberOfSectionsInTableView 委托方法返回 0。这似乎是问题的原因。在随后的加载中,它会返回正确的数字。我已经记录了获取的结果控制器,它每次都获取一整套结果......

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
   NSLog([NSString stringWithFormat:@"Number of Sections = %i", [[self.fetchedResultsController sections] count]]);
   return [[self.fetchedResultsController sections] count];
}
4

1 回答 1

0

你是否正确地响应变化?从文档...

直到控制器的托管对象上下文收到 processPendingChanges 消息后,更改才会反映。因此,如果您更改托管对象的属性值,以使其在获取的结果控制器的结果集中的位置发生更改,则控制器报告的其索引通常不会更改,直到当前事件周期结束(调用 processPendingChanges 时) )。

听起来在您初始导入后,您的上下文没有处理它的更改,因此没有通知您的 FRC

于 2013-01-17T00:32:16.867 回答