【问题标题】:Issues handing over managedObjectContext移交 managedObjectContext 的问题
【发布时间】:2012-08-04 00:50:57
【问题描述】:

我一直在阅读有关此项目的大多数问题,但不知何故我无法弄清楚这一点。

我很容易将 ManagedObjectContext 从 AppDelegate 移交给我之前尝试过的应用程序中的第一个视图,其中初始 viewController 也处理数据。

现在在我正在构建的新应用程序中,我需要一个初始屏幕,用户需要在其中进行选择(通过几个可能的按钮)。根据我的故障排除,在此屏幕上我的 MOC 仍然完好无损(NSLog 消息为我提供了 MOC 的有效地址)。

一旦做出选择,应用程序就会进入一个带有 TableView 的 UIViewController。在这个视图中,我应该能够管理我的数据,但我的 MOC 返回 nil。

应用通过 UINavigationController 进入下一个视图。

我在我的 AppDelegate 中加入了以下代码:

UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
InitialViewController *controller = (InitialViewController *)navigationController.topViewController;
controller.managedObjectContext = self.managedObjectContext;
return YES;

InitialViewController 是第一个 ViewController,一切都还好。

下一个视图控制器称为 MasterViewController 并且是 NSFetchedControllerDelegate。在这里,我似乎无法访问 NOC。我已经尝试了之前关于同一主题的问题中建议的几种方法和解决方案,但似乎都没有奏效。

如何通过正确的编码让 NOC 在 MasterViewController 中工作?

哦,是的,其中一个有效的解决方案是在 MasterViewController 中的 ViewDidLoad 之后,我插入以下代码:

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
self.managedObjectContext = appDelegate.managedObjectContext;

我的 MOC 现已上市,但这是正确的做法吗?

【问题讨论】:

    标签: objective-c ios5 core-data nsmanagedobjectcontext


    【解决方案1】:

    如果您使用的是故事板,

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        [super prepareForSegue:segue sender:sender];
        if ([[segue identifier] isEqualToString:@"segueNameOfPresentingYourModalViewController"] == YES) {
            UINavigationController *navigationController = segue.destinationViewController;
            YourCustomViewController *aController = (YourCustomViewController *)navigationController.topViewController;
            aController.managedObjectContext = self.managedObjectContext;
        }
        else if ([segue.identifier isEqualToString:@"segueNameOfPushingYourViewController"] == YES) {
            YourCustomViewController *aController = segue.destinationViewController;
            aController.managedObjectContext = self.managedObjectContext;
        }
    }
    

    如果您不使用 Storyboards,您同样可以将视图控制器的 managedObjectContext 设置在您将要推送或呈现它的位置。另一个常见的地方是-tableView:didSelectRowAtIndexPath: 方法。

    【讨论】:

    • 为什么我没有想到通过 segue 将其移交?这看起来像是一个没有声明全局变量的优雅方法......我将在今天晚些时候在我的代码上尝试这个并返回我的发现,但我觉得这应该可以正常工作。
    • 按预期测试工作正常。感谢您的意见,通常看起来难以克服的问题有一个相当简单的解决方案。
    【解决方案2】:

    您编写了“controller.managedObjectContext”,因此您清楚地向 InitialViewController 添加了 NSManagedObjectContext* 属性。您只需将相同的属性添加到 MasterViewController,并将 self.managedObjectContext 也分配给它。

    如果您不想将 moc 添加到每个控制器,只需为您的 MOC 声明一个全局变量并没有错:

    在您的 appDelegate.h 中:

    extern NSManagedObjectContext* moc;
    

    现在任何 .m 都有:

    #import "AppDelegate.h"
    

    将有权访问 moc。您也可以只向您的 appDelegate 添加一个属性,然后在每个控制器中您可以执行以下操作:

    AppDelegate* app = (AppDelegate*)[[UIApplication sharedApplication] delegate];
    app.managedObjectContext
    

    【讨论】:

    • 拥有可以随意访问的全局变量并不是一个好习惯。传递托管对象上下文要好得多。我什至建议使用initWithManagedObjectContext: 方法,然后将托管对象上下文保存到实例变量中。
    • 我知道您的解决方案,但它们似乎不是一个好的做法。我需要一个解决方案,我只在每次视图的基础上交出 MOC。这样,如果在未来的项目中我想与更大的项目合作,我可以在将数据写入“主 MOC”之前声明一个新的 MOC 来临时存储数据(不知道我是否在这里表达清楚)。无论如何,感谢您的回复,但不是我想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    • 2019-01-30
    • 2020-07-17
    相关资源
    最近更新 更多