2012-07-12 70 views
0

我试图选择名为“selectedPractice”的名为“Practice”的名为“Practice”的对象,名为SelectorViewController的视图控制器上,然后保留在另一个名为RegularViewController的控制器中使用的结果。两者都是UIViewControllers,因为我试图追加核心数据的现有应用程序不使用Tab或NavigationControllers。ViewControllers之间传递NSFetchedResultsController

我尝试使用以下代码来设置两个控制器的ManagedObjectContexts是相同的AppDelegate在AppDelegate.m:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
SelectorViewController *svc; 
    svc.managedObjectContext = self.managedObjectContext; 
    svc.fetchedResultsController = self.fetchedResultsController; 

    RegularViewController *rvc; 
    rvc.managedObjectContext = self.managedObjectContext; 
    rvc.fetchedResultsController = self.fetchedResultsController; 
     return YES; 
} 

AppDelegate.m还具有setupFetchedResultsController方法这里(改编自Tim Roadley的出色工作):

- (void)setupFetchedResultsController 
{ 
    // 1 - Decide what Entity you want 
    NSString *entityName = @"Practice"; // Put your entity name here 
    NSLog(@"AppDelegate Setting up a Fetched Results Controller for the Entity named %@", entityName); 

    // 2 - Request that Entity 
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:entityName]; 

    // 3 - Filter it if you want 
    //request.predicate = [NSPredicate predicateWithFormat:@"Practice.name = Blah"]; 

    // 4 - Sort it if you want 
    request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"name" 
                        ascending:YES 
                         selector:@selector(localizedCaseInsensitiveCompare:)]]; 

    // 5 - Fetch it 
    self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request 
                     managedObjectContext:self.managedObjectContext 
                      sectionNameKeyPath:nil 
                        cacheName:nil]; 
    [self.fetchedResultsController performFetch:nil]; 
    NSLog(@"AppDelegate setupFetchedResultsController completed"); 
} 

这个运行正常,所有NSLogs显示。 SelectorViewController.m中有setupFetchedResultsController的另一个实例,但它会导致下列日志崩溃。 FetchedResultsController是否正在重新启动?

2012-07-12 20:49:07.652 WhiteHealth [6969:15b03] SelectorViewController 排序实体完整2012-07-12 20:49:07.653 WhiteHealth [6969:15b03] *终止应用程序,由于未捕获的异常 'NSInvalidArgumentException' 的,理由是: ' NSFetchedResultsController的一个实例都需要一个非空fetchRequest和 managedObjectContext'

- (void)performFetch 
{ 
    if (self.fetchedResultsController) { 
     if (self.fetchedResultsController.fetchRequest.predicate) { 
      if (self.debug) NSLog(@"[%@ %@] fetching %@ with predicate: %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd), self.fetchedResultsController.fetchRequest.entityName, self.fetchedResultsController.fetchRequest.predicate); 
     } else { 
      if (self.debug) NSLog(@"[%@ %@] fetching all %@ (i.e., no predicate)", NSStringFromClass([self class]), NSStringFromSelector(_cmd), self.fetchedResultsController.fetchRequest.entityName); 
     } 
     NSError *error; 
     [self.fetchedResultsController performFetch:&error]; 
     if (error) NSLog(@"[%@ %@] %@ (%@)", NSStringFromClass([self class]), NSStringFromSelector(_cmd), [error localizedDescription], [error localizedFailureReason]); 
    } else { 
     if (self.debug) NSLog(@"[%@ %@] no NSFetchedResultsController (yet?)", NSStringFromClass([self class]), NSStringFromSelector(_cmd)); 
    } 
    [pickerView reloadAllComponents]; 
} 

- (void)setupFetchedResultsController 
{ 
    // 1 - Decide what Entity you want 
    NSString *entityName = @"Practice"; // Put your entity name here 
    NSLog(@"SelectorViewController Setting up a Fetched Results Controller for the Entity named %@", entityName); 

    // 2 - Request that Entity 
    [NSFetchedResultsController deleteCacheWithName:nil]; 
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:entityName]; 
    NSLog(@"SelectorViewController requesting entity complete"); 

    // 3 - Filter it if you want 
    //request.predicate = [NSPredicate predicateWithFormat:@"Person.name = Blah"]; 

    // 4 - Sort it if you want 
    request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"name" 
                        ascending:YES 
                         selector:@selector(localizedCaseInsensitiveCompare:)]]; 
    NSLog(@"SelectorViewController sorting entity complete"); 

    // 5 - Fetch it 
    self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request 
                     managedObjectContext:self.managedObjectContext 
                      sectionNameKeyPath:nil 
                        cacheName:nil]; 
    [self performFetch]; 

} 

回答

3
SelectorViewController *svc; 
svc.managedObjectContext = self.managedObjectContext; 
svc.fetchedResultsController = self.fetchedResultsController; 

RegularViewController *rvc; 
rvc.managedObjectContext = self.managedObjectContext; 
rvc.fetchedResultsController = self.fetchedResultsController; 
    return YES; 

不会为你设置managedObjectContexts,你不初始化svc和rvc,你所做的只是创建对象。如果你想设置managedObject上下文,进入viewDidLoad's或者在你运行提取请求之前,并且执行以下检查:

if (self.managedObjectContext == nil) { 
    self.managedObjectContext = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
} 
+0

这很好用 - 非常感谢。 – 2012-07-13 14:27:54

相关问题