在故事板中使用Core Data和标签栏控制器

时间:2012-04-30 19:36:59

标签: iphone ios core-data storyboard

我从视图控制器以模态方式调用标签栏控制器,以实现用户可以配置的一系列附加控件和输入。在故事板中,这很容易做到但是如何才能最好地将Core Data托管对象上下文传递给由选项卡控制器托管的视图控制器?这里最好的设计方法是什么:

  1. 忘记故事板并在代码中执行应用程序的这一部分?这很简单。我只是将托管对象上下文传递给每个视图,然后再将它们添加到选项卡控制器。
  2. 将托管对象上下文属性添加到启动选项卡视图控制器的视图控制器中?这当然可以使用每个目标视图控制器中的presentingViewController属性,但似乎不是最初的目的。
  3. 直接通过根视图控制器的某些属性进行通信?我在网上看到了对此的引用,但我不确定。
  4. 来自托管数据上下文的公寓,从dismissModalViewController消息返回返回原始视图的任何其他内容都不需要。其他所有内容都通过Core Data进行管理。

2 个答案:

答案 0 :(得分:1)

有两种选择:

  1. prepareForSegue期间传递托管对象上下文(您必须访问选项卡视图控制器的viewControllers数组以获取您的各个视图控制器)
  2. 构建您的应用程序,以便核心数据堆栈可以全局使用,可以是应用程序委托类,也可以是单独的单例。然后,视图控制器可以在需要时请求托管对象上下文。
  3. 可能会对您设置某个对象的代理进行一些滥用,因为标签栏控制器的委托碰巧保存了托管对象上下文 - 然后可以从选项卡中的所有视图控制器获得酒吧控制器。这刚刚发生在我身上,可能是一个坏主意。

答案 1 :(得分:0)

当主视图控制器收到-prepareForSegue:消息时,标签栏控制器和它管理的视图控制器已经创建。您可以从segue本身获取标签栏控制器,然后从标签栏控制器中获取视图控制器数组,如下所示:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    UITabBarController *tbc = [segue destinationViewController];
    NSArray *controllers = [tbc viewControllers];
    NSLog(@"View Controllers: %@", controllers);
}

现在,您需要进行一些错误检查,以确保目标控制器确实是标签栏控制器,但您可以用代码替换NSLog()以配置您喜欢的控制器。出于您的目的,这只是意味着将它们应该运行的托管对象上下文交给它们。