AppDelegate找不到ViewController声明和合成的属性。

3

我的应用已经开发了几个月,现在被要求添加Core Data。唉,这是一个tabViewController应用程序。我不知道这是否有助于回答问题。

所以我正在尝试添加它,但是我遇到了错误。我在AppDelegate.h中构建了Core Data,因此我创建了这些IVARs,并在.m文件中适当地构建它们。

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

在需要使用CoreData交互的视图控制器中,我已经给它们(在.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和viewController2):

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

我不理解这个,因为两个视图控制器中的属性都显然存在并被合成。

我甚至试过退出并重新启动XCode。也许需要重新启动系统?<--这听起来很荒谬吗?

(我知道我可能添加了比你所需更多的内容..)有什么帮助吗?


控制器头文件是否正确导入? - fabrice truillot de chambrier
是的,该应用程序已经开发了几个月,使用相同的ViewControllers构建并运行良好(除了设置属性)。 - esreli
我首先想问一下,你为什么要尝试设置可能是只读的属性呢? - CodaFi
为了整合CoreData,我创建了一个使用CoreData的新项目,并查看了所创建的内容。我认为这是将CoreData添加到我的项目中最安全的方法,因为它是苹果默认的。它们不是只读的。 - esreli
你能否在这些错误中构建,还是不能? - CodaFi
不,它们是错误而不是警告。如果我注释掉那两行代码,我就可以构建通过。 - esreli
2个回答

0
我在另一个 post 上找到了这个答案:
“另一种方法是从您的应用程序委托中提取上下文 - 目前如果更改应用程序组织方式,则必须重新编码应用程序委托。 您可以在任何地方获取指向应用程序委托的指针,因此以下代码片段可以添加到任何视图控制器中:”
AppDelegate *delegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];  
self.managedObjectContext = delegate.managedObjectContext;

通常在viewDidLoad中。

感谢用户jrturton的回答


0

首先,如果应用程序已经创建没有CoreData,则使用UIManagedDocument设置核心数据更容易。

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

Objective c - Core Data saving approach

其次,您的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.

希望这可以帮到你!

无论使用UIManagedDocument与否,下面的代码仍然无法工作。似乎我甚至不能制作一个公共方法来设置它。如果你能提供更好的解决方案,我会重新确认你的答案!先谢谢了。 - esreli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接