【发布时间】:2012-06-02 03:02:27
【问题描述】:
我的应用使用 CoreData。它有一个 UISegmentedControl 和一个表格视图。 UISegmentedControl 用于根据不同的标准更新 tableview。
UISegmentedControl 的第一个选项将在单个 tableview 部分中显示所有数据。所以我在 - (NSFetchedResultsController*)fetchedResultsController
中使用了以下代码frc = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:[self managedObjectContext]
sectionNameKeyPath:nil
cacheName:@"Root"];
第二个选项将在多个表格视图部分显示数据。所以我需要 NSSortDescriptor 并设置 sectionNameKeyPath。
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"city"
ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
NSFetchedResultsController *frc = nil;
frc = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:[self managedObjectContext]
sectionNameKeyPath:@"city"
cacheName:@"Root"];
因为 sectionNameKeyPath 不同,每个都需要不同的 NSSortDescriptor,我假设我需要两个不同的 NSFetchedResultsController。
我用来重新加载tableview的代码:
- (void) touchDownAtSegmentIndex:(NSUInteger)segmentIndex{
NSPredicate *predicate;
NSError *error;
[NSFetchedResultsController deleteCacheWithName:@"Root"];
if(segmentIndex == 0)
{
}
else if(segmentIndex == 1)
{
}
else
{
return;
}
[[[self fetchedResultsController] fetchRequest] setPredicate:predicate];
[[self fetchedResultsController] performFetch:&error];
[[self tableView] reloadData];
}
任何人都可以向我提供一个使用两个 NSFetchedResultsController 的代码示例。 谢谢。
解决方案:
除了来自@iTukker 的想法,我在返回fetchedResultsController 之前添加了更多检查。如果不进行此项检查,此方法将返回fetchedResultsController,而不是执行switch .. case .. 语句。
- (NSFetchedResultsController*)fetchedResultsController {
.....
if ((fetchedResultsController!= nil) && [self.segmentChanged isEqualToString:@"false"])
return fetchedResultsController;
.....
if (frc == nil) {
switch (segmentendControl.selectedSegmentIndex) {
case 0: {
frc = ... //first frc
[frc retain];
break;
}
case 1: {
frc = ... //second frc
[frc retain];
break;
}
}
}
....
}
【问题讨论】:
标签: objective-c core-data