将managedObjectContext从app委托传递给视图控制器

时间:2014-05-08 01:10:02

标签: ios core-data

使用apple的核心数据配方示例应用程序,我已经了解了如何将appObjectate中的managedObjectContext传递给其他视图控制器。但是,我试图将managedObjectContext传递给不在标签栏控制器的一部分的视图控制器,所以我可以将它用于选择列表类型视图控制器,当我尝试运行它时在视图控制器中,managedObjectContext的值保持为空,表示上下文未被传递。我希望有人可以告诉我正确的方法。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary     *)launchOptions
{

// pass down our managedObjectContext to our AssessmentListTableViewController
UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController;
UINavigationController *nav1Controller = tabBarController.viewControllers[0];

AssessmentListTableViewController *assessmentListVC = (AssessmentListTableViewController *)nav1Controller.topViewController;
assessmentListVC.managedObjectContext = self.managedObjectContext;

//pass down our managedObjectContext to our ClientListTableViewController
UINavigationController *nav2Controller = tabBarController.viewControllers[1];

ClientListTableViewController *clientListVC = (ClientListTableViewController *)nav2Controller.topViewController;
clientListVC.managedObjectContext = self.managedObjectContext;

//pass down managedObjectContext for use in the AddEpisodeInfo view controller
AddEpisodeInfo *addEpisodeInfoVC = [[AddEpisodeInfo alloc]init];
addEpisodeInfoVC.managedObjectContext = self.managedObjectContext;

//pass down manageObjectContext to a separate tableview controller which allows me to pick the assessment to use
PickAssessmentTableViewController *pickAssessmentTableVC = [[PickAssessmentTableViewController alloc]init];
pickAssessmentTableVC.managedObjectContext = self.managedObjectContext;

return YES;
}

managedobjectcontext的前两个传递正常工作,但最后一个不起作用,我不确定原因。

2 个答案:

答案 0 :(得分:3)

您不应在AppDelegate中分配这些viewControllers。这些不是您稍后在应用中遇到的viewController。它们是完全独立的实例。

您希望在自然创建viewController的任何地方传递上下文。

例如,如果您推送一个新的viewController,您可以在创建viewController的位置设置上下文:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    PickAssessmentTableViewController *pickAssessmentTableVC = [[PickAssessmentTableViewController alloc]init];
    pickAssessmentTableVC.managedObjectContext = self.managedObjectContext;

    // setup...

    // and push
    [self.navigationController pushViewController:pickAssessmentTableVC animated:YES];
}

或者如果你使用segue,你可以通过访问segue的destinationViewController在prepareForSegue:sender:中设置上下文:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"pushAddEpisodeInfo"]) {
        AddEpisodeInfo *addEpisodeInfoVC = (AddEpisodeInfo *)segue.destinationViewController;
        addEpisodeInfoVC.managedObjectContext = self.managedObjectContext;
    }
}

是的,这意味着您可能需要向viewControllers添加managedObjectContext属性,而这些属性实际上并不会自动使用Core Data。这样你就可以将上下文传递给下一个viewController。这是预期的而不是问题。

答案 1 :(得分:0)

您在仅在函数范围内的变量中实例化pickAssessmentTableVC。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary     *)launchOptions

由于您没有任何其他参考资料,ARC只会在功能结束时将其发布。

尝试放

@property (nonatomic) pickAssessmentTableVC;
在您的app委托界面中

并将行更改为

pickAssessmentTableVC = [[PickAssessmentTableViewController alloc]init];

此外,您似乎已经有很多核心数据正在进行中,我强烈建议您使用Magical record这样的帮手 - 从长远来看,它会让您的生活变得轻松一百倍并且你根本不需要担心跟踪上下文。

相关问题