这是我的情况:
我有一个应用程序,它在我的应用程序的初始视图中从 Core Data 加载一个表。让我们称之为 View1TVC。AppDelegate.m 已设置,因此 View1TVC 是初始视图。
现在在 View2TVC 中,我正在尝试加载 SAME TABLE(在 View1TVC 中过滤),但应用程序崩溃并出现以下错误:
由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“NSFetchedResultsController 的实例需要非零 fetchRequest 和 managedObjectContext
为 View1TVC 和 View2TVC 加载表格的相关代码是相同的!!它适用于 View1TVC,但不适用于 View2TVC。这是 View2TVC 代码:
-(void)setupFetchedResultsController
{
NSString *entityName = @"Task";
NSLog(@"Setting up a Fetched Results Controller for the Entity named %@", entityName);
// REQUEST:
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:entityName];
// SORT:
request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor
sortDescriptorWithKey:@"name"
ascending:YES
selector:@selector(localizedCaseInsensitiveCompare:)]];
// FETCH:
self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
managedObjectContext:self.managedObjectContext
sectionNameKeyPath:nil
cacheName:nil];
[self performFetch];
}
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self setupFetchedResultsController];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
// Configure the cell...
Task *task = [self.fetchedResultsController objectAtIndexPath:indexPath];
cell.textLabel.text = task.name;
return cell;
}
该应用程序在转到 View2TVC 并到达 setupFetchedResultsController 方法的 SORT 行时会特别挂起:
request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)]];
有人知道吗?该错误是否与我在 AppDelegate.m 中将 View1TVC 标识为我的默认应用程序有关?这是 AppDelegate.m 中的代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
View1TVC *controller = (View1TVC *)navigationController.topViewController;
controller.managedObjectContext = self.managedObjectContext;
return YES;
}
我非常感谢任何人可以提供的任何见解!谢谢。