在核心数据应用程序(Xcode4)中将根视图控制器更改为选项卡视图控制器

时间:2012-03-29 07:15:04

标签: iphone objective-c

我是制作核心数据iPhone应用程序的新手。我在Xcode中创建了一个新的核心数据项目,并尝试添加一个标签栏控制器作为根视图控制器,然后将默认的tableview控制器放在此层次结构中的导航控制器之后:

- >标签栏控制器 - >导航控制器 - > TableView控制器 - > TableView Controller2 - >详细说明控制器

我之前使用导航和标签栏控制器实现了一个应用程序,但是对于这个应用程序,我需要在整个应用程序中访问managedObjectModel。

我已经尝试过使用appfate,例如didFinishLaunchingWithOptions等。 我总是得到类似'

的消息
  

'由于未捕获的异常而终止应用   'NSInvalidArgumentException',

     

原因:' - [UITabBarController   topViewController]:无法识别的选择器发送到实例'

这是我用来访问ManagedObjectContext的代码:

AppDelegate *appDelegate = 
[[UIApplication sharedApplication] delegate];

NSManagedObjectContext *context = [appDelegate managedObjectContext];
NSManagedObject *newCoffee;
newCoffee = [NSEntityDescription
              insertNewObjectForEntityForName:@"Coffee"
              inManagedObjectContext:context];

我收到了这个错误:

  

'AppDelegate'没有可见的@interface声明选择器'managedObjectContext'

我刚注意到Xcode说它是一个ARC问题,如何在启用ARC的情况下访问mod?

3 个答案:

答案 0 :(得分:3)

如果我理解您的问题是正确的,那么您希望能够访问NSManagedObjectModel,这样您就可以访问存储的数据了。我是对的吗?

首先,您应该在viewController中导入Appdelegate,您需要在其中保存或加载数据。

其次,您应该在viewDidLoad中实现它:

    self.context = [self context];

    if (self.context == nil) 
    { 
        self.context = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
    }

在头文件中使用@property(非原子,保留)NSManagedObjectContext *上下文。

答案 1 :(得分:0)

我建议您将托管对象上下文从控制器传递给控制器​​。此外,如果您正在使用托管对象初始化某个视图控制器,则可以通过该对象的managedObjectContext属性访问MOC。

答案 2 :(得分:0)

当说管理对象模型时,你的意思是管理对象上下文 - 对吗?

在这两种情况下:您可以通过共享应用程序对象的委托随时访问上下文和模型,如下所示:

[(YourAppDelegateClass *)[UIApplication sharedApplication] managedObjectContext]

但您也可以为每个视图控制器创建一个属性,并将该上下文传递给层次结构。