【问题标题】:AppDelegate not finding declared and synthesized property of ViewControllerAppDelegate 没有找到 ViewController 的声明和合成属性
【发布时间】:2012-06-14 19:07:38
【问题描述】:

我的应用程序已经开发了几个月,现在我被要求添加核心数据。 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交互的viewController中,我已经给出了(在.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。可能是系统重启?

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

【问题讨论】:

  • 控制器头文件是否正确#import'ed?
  • 是的,该应用程序已经开发了几个月,使用相同的 ViewControllers 并且构建和运行良好(除了设置属性)。
  • 我首先要问你为什么要尝试设置可能是或可能不是readonly的属性...
  • 为了合并 CoreData,我使用 CoreData 创建了一个新项目,并查看了创建的内容。我认为这种方式是将 CoreData 添加到我的项目中最安全的方式,因为它是 Apple 的默认设置。它们不是只读的。
  • 你能否克服这些错误?

标签: objective-c ios core-data properties uiapplicationdelegate


【解决方案1】:

首先,如果应用程序已经创建withoutCoreData,则使用 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,下面的代码仍然不起作用。好像我什至不能创建一个公共方法来设置它。如果您能提供更好的解决方案,我会再次确认您的答案!提前致谢
【解决方案2】:

我在另一个 post 上找到了这个答案:

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

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

通常在 viewDidLoad 中。”

感谢用户:jrturton 的回答

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-26
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多