3

我的应用程序已经开发了几个月,现在被要求添加核心数据。SMH。它是一个 tabViewController 应用程序。我不知道这是否有助于回答。

所以在这里我试图添加它,但我遇到了错误。我在AppDelegate.h中为 Core Data 构建,所以我创建了这些 IVAR 并稍后在 .m 中适当地构建它们。

@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;

在需要 CoreData 交互的 viewControllers 中,我已经给出了它们(在 .h 文件中):

@property (strong, nonatomic) NSFetchedResultsController *fetchedResultsController;
@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;

并在.m中合成它们:

@synthesize fetchedResultsController = __fetchedResultsController;
@synthesize managedObjectContext = __managedObjectContext;

现在,回到AppDelegate。在 .m 中,当我尝试将 managedObjectContext 的指针从委托传递给视图时(就像这样):

viewController1.managedObjectContext = self.managedObjectContext;
viewController2.managedObjectContext = self.managedObjectContext;

我收到一个 XCode 错误(对于 viewController1 和 2):

Property 'managedObjectContext' not found on object of type 'UIViewController *'

我不明白这一点,因为两个视图控制器中的属性显然存在并且是合成的。

我什至尝试过退出并重新启动 XCode。可能是系统重启?<-- 这很荒谬吗?

(我知道我添加的内容超出了您的需要。)有什么帮助吗?

4

2 回答 2

0

首先,如果应用程序已经创建了withoutCoreData,那么使用 UIManagedDocument 来设置核心数据会更容易。

所以我会首先在 AppDelegate 中执行此操作。请参阅苹果开发者网站上的 UIManagedDocument 类参考以及我在此处的回答以寻求帮助:

目标 c - 核心数据保存方法

其次,您的 appDelegate 应该知道您的初始视图控制器实际上是您的UITabBarController,并且您的标签栏控制器知道它的第一个视图控制器应该是您的上下文的目标,因此需要NSManagedObejectContext公共 API 中的属性。

所以我忘记了确切的代码,但它类似于:

// in appDidFinishLaunchingWithOptions or somewhere
UITabBarController* tabBarController = self.window.rootViewController;
UIViewController* viewController = [tabBarController.viewControllers objectAtIndex:[your first controller]];

// Pass your context
viewController.managedObjectContext = self.managedObjectContext;

// Be sure to #import your first viewControllers API so that propert is visible.
// That may have been your initial problem.

希望这对你有帮助!

于 2012-06-14T19:54:50.390 回答
0

我在另一篇文章中找到了这个答案:

“另一种方法是从您的应用程序委托中提取上下文 - 目前,如果您更改应用程序的组织方式,则必须重新编码应用程序委托。您可以在任何地方获得指向应用程序委托的指针,因此以下内容一段代码可以添加到任何视图控制器:

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

通常在 viewDidLoad 中。”

感谢用户:jrturton的回答

于 2012-06-18T19:15:30.507 回答