【问题标题】:How to pass NSManagedObjectContext back up to root view in UINavigationController?如何将 NSManagedObjectContext 传递回 UINavigationController 中的根视图?
【发布时间】:2010-08-02 14:47:38
【问题描述】:

我可能只是在这里完全错误地在视图之间传递数据,所以我愿意完全改变我来回传递数据的方式。

我的应用程序委托创建 NSManagedObjectContext 并使用 UINavigationController 将其传递到我的主菜单,使其成为根视图:

MainMenuViewController *mainMenuViewController = [[MainMenuViewController alloc] init];

NSManagedObjectContext *context = [self managedObjectContext];
if (!context) {
    // Handle the error.
}
// Pass the managed object context to the view controller.
mainMenuViewController.managedObjectContext = context;

UINavigationController *aNavigationController = [[UINavigationController alloc] initWithRootViewController:mainMenuViewController];
self.theNavController = aNavigationController;

[[self theNavController] setNavigationBarHidden:YES animated:NO];

[window addSubview:theNavController.view];
[window makeKeyAndVisible];

[mainMenuViewController release];
[aNavigationController release];

然后当他们从主菜单中选择不同的视图控制器时,我初始化新的视图控制器,将 NSManagedObjectContext 传递给它,然后将其推送到 UINavigationController:

BombsViewController *bombsViewController = [[BombsViewController alloc] init];
bombsViewController.managedObjectContext = self.managedObjectContext;
[self.navigationController pushViewController:bombsViewController animated:YES];
[bombsViewController release];

一切都很好,直到我决定从 BombsViewController 返回主菜单。我正在尝试使用以下内容将根视图控制器弹出回 UINavigationController:

[self.navigationController popToRootViewControllerAnimated:YES];

但是,由于 popToRootViewControllerAnimated 方法不接受视图,因此我看不到将我的 NSManagedObjectContext 发送回根视图控制器的方法。我尝试使用 popToViewController:animated: 方法,但随后应用程序崩溃,并出现“在抛出 'NSException' 实例后调用终止”、“程序收到信号:“SIGABRT”。强>”:

MainMenuViewController *mainMenuViewController = [[MainMenuViewController alloc] init];
mainMenuViewController.managedObjectContext = self.managedObjectContext;
[self.navigationController popToViewController:mainMenuViewController animated:YES];
[mainMenuViewController release];

【问题讨论】:

    标签: iphone core-data delegates uinavigationcontroller


    【解决方案1】:

    为什么要寄回去?你的根视图控制器还没有被-dealloc'ed 所以它仍然存在于内存中并且仍然有对NSManagedObjectContext 的引用。没有什么可以传回去的。

    您遇到的错误与核心数据无关。在调试器中运行它并在objc_exception_throw 上设置一个断点并查看它在哪里崩溃。

    【讨论】:

    • 我的印象是,当视图控制器不再是 UINavigationController 的当前焦点时,它们会自动解除分配。猜猜这会改变一切。
    • 它们只有在从堆栈中移除时才会被释放。当您将另一个视图推到顶部时,它不会释放下面的视图。当您将视图控制器从堆栈中弹出时,它就会被释放。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-27
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 2012-01-27
    相关资源
    最近更新 更多