我已经使用上述 Marcus 的指南实现了这一点(我是新手,所以它可能不是最好的方法)。我有一个分段控制器,其中包含“打开”、“进行中”和“关闭”三个选项。
在 ViewController.h 中,为每个段选项创建一个 iVar,并为将存储当前控制器的主控制器创建一个 iVar。
@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;
@property (nonatomic, retain) NSFetchedResultsController *inprogressFetchedResultsController;
@property (nonatomic, retain) NSFetchedResultsController *openFetchedResultsController;
@property (nonatomic, retain) NSFetchedResultsController *closedFetchedResultsController;
在 ViewController.m 中你需要创建延迟加载这些控制器的方法,所以我一共有三个。除了谓词和缓存名之外,它们基本相同,我在下面只展示了一个。
- (NSFetchedResultsController *)closedFetchedResultsController
{
if (_closedFetchedResultsController != nil) {
return _closedFetchedResultsController;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Edit the entity name as appropriate.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Ticket" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
// Set the batch size to a suitable number.
[fetchRequest setFetchBatchSize:20];
// Edit the sort key as appropriate.
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"priority.name" ascending:NO];
NSArray *sortDescriptors = @[sortDescriptor];
[fetchRequest setSortDescriptors:sortDescriptors];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"status = 'Closed'"];
[fetchRequest setPredicate:predicate];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"priority.name" cacheName:@"ClosedTickets"];
aFetchedResultsController.delegate = self;
self.closedFetchedResultsController = aFetchedResultsController;
NSError *error = nil;
if (![self.closedFetchedResultsController performFetch:&error]) {
// Replace this implementation with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return _closedFetchedResultsController;
}
为您的段创建一个 IBAction,以便在更改时更改获取的结果控制器并重新加载表。
- (IBAction)statusChanged:(id)sender {
switch (self.segmentControl.selectedSegmentIndex) {
case 0:
self.fetchedResultsController = self.inprogressFetchedResultsController;
break;
case 1:
self.fetchedResultsController = self.openFetchedResultsController;
break;
case 2:
self.fetchedResultsController = self.closedFetchedResultsController;
break;
default:
break;
}
[self.tableView reloadData];
}
就是这样!
注意我还将这一行添加到我的 ViewDidLoad 方法中,以便它最初将正确的选项加载到 fetchedResultsController 中。
self.fetchedResultsController = self.inprogressFetchedResultsController;