3

在研究并试图弄清楚如何解决以下问题时,我已经用键盘敲打了 3 天。

我有一个看起来像这样的故事板:

初始应用启动箭头 -> 到导航控制器 -> 到主视图控制器。

我的 appDelegate 正在创建 managedObjectContext 并用数据填充一些实体(仅用于测试目的,一旦我准备好与外部源集成,它将被删除)。这工作很好。现在我的问题是我不知道如何将 MOC 从 appDelegate 传递到我的第一个 ViewController,因为导航控制器挡住了路。我当前在 appDidFinish 方法中的代码如下所示:

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

    // Pass the managed object context to the root view controller
    MainMenuViewController *rootView = (MainMenuViewController *)self.window.rootViewController;
    rootView.managedObjectContext = self.managedObjectContext; 

    //My actual Core data setup and adding data to it, it works I've tested it.

    return YES;
     }

现在,当我将情节提要中的应用程序启动箭头更改为指向我的 mainMenuViewController 时,我的代码可以工作,但是我在所有视图中都丢失了导航栏。我也知道如何将 MOC 从我- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender的 mainMenu通过.

我已经在这个站点(和其他站点)上搜索了许多线程,我只找到了“选项卡式应用程序”的解决方案,其他人希望我序列化对象,但出于我的目的,我不能这样做。(只有少数视图会收到 MOC,而其他视图将是一个视图创建和更改的通行证数据,以便在独特视图中为特定目的量身定制)

非常感谢对 iOS 和 Objective-C 中这个小块的任何帮助。先感谢您。

编辑:我得到的错误是“由于未捕获的异常而终止应用程序...... [UINavigationController setManagedObjectContext] 无法识别的选择器发送到实例......

4

3 回答 3

10

如果您从 Xcode 4.3(我认为也是 4.2)中的“Master-Detail”应用程序模板创建一个新应用程序,并选中“Use Storyboard”和“Use Core Data”选项,您将在AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
    MasterViewController *controller = (MasterViewController *)navigationController.topViewController;
    controller.managedObjectContext = self.managedObjectContext;
    return YES;
}

这似乎正是您正在寻找的。关键是您可以查询导航控制器的视图控制器。

于 2012-03-17T05:17:45.750 回答
2

如果 NSManagedObjectContext 是在 AppDelegate 中设置的,则不要通过它;相反,您创建对它的引用:

AppDelegate *appDel = [UIApplication sharedApplication].delegate;   
NSManagedObjectContext *context = appDel.managedObjectContext;

您引用它的对象类型无关紧要,接收对象和 AppDelegate 之间的任何其他类型的对象也是如此。

于 2016-03-13T00:16:25.720 回答
0

除了我的第一个答案,它与接受的答案基本相同——除了我的,你可以在有或没有任何模板的情况下使用它(而不仅仅是拆分视图模板)——我提供的答案甚至更直接地回答了您的问题,那就是如何在 segue 之后将对上下文管理器对象的引用传递给目标视图控制器。

这个答案,就像我的第一个答案(与接受的答案不同),假设您至少知道托管对象上下文在您的应用程序中的位置,并且您具有创建对它的引用所需的基本技能(与接受的答案不同,它假定您不能在 Xcode 中使用 Find... ,也不能记住如何为指针赋值,例如:

id moc = [reference to the managed object context object that you can find]

由于您似乎对涉及模板的答案做出了更好的响应,因此请尝试prepareForSegueSingle Application View 模板中 UIViewController 子类中提供的方法覆盖。在里面,您会注意到 Apple 留下的一些评论。

简而言之,您将像这样创建对目标视图控制器的引用:

SecondVC *vc2 = segue.destinationController;

然后,将目标视图控制器中对托管对象上下文变量的指针引用的值设置为创建实例时对其的引用点的值:

vc2.mbo = AppDelegate.mbo;

我在以下位置提供了一个非常详尽的示例(带有视频演示),用于创建没有故事板(即以编程方式)的 segue:

以编程方式设置 segue 标识符

顺便说一句,如果您在我的回答中难以理解 AppDelegate 参考的使用,我会解释一下:

  1. 每当您使用任何 Xcode 模板创建新项目时,Apple 都会将其 Core Data 托管对象上下文引用放在 AppDelegate.h/.m 中,并在模板设置期间选中 Use Code Data 复选框。要在整个应用程序中使用该引用(即,在其他 .m 文件中,因此您不会无意中创建它的多个实例),您需要创建对 AppDelegate 的全局、应用程序范围的引用——它恰好是 UIApplication 的委托,这是一个单例,也使 AppDelegate 成为单例——只需将其添加到您打算在其中引用托管对象上下文的每个实现文件中:

    导入“AppDelegate.h”

    定义 AppDelegate ((AppDelegate *)[[UIApplication sharedApplication] delegate])

现在,您可以在添加这两行的任何位置访问托管对象上下文对象:

[AppDelegate.mbo...];
于 2016-12-21T18:41:01.170 回答