Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c AppDelegate未找到ViewController的已声明和合成属性_Objective C_Ios_Core Data_Properties_Uiapplicationdelegate - Fatal编程技术网

Objective c AppDelegate未找到ViewController的已声明和合成属性

Objective c AppDelegate未找到ViewController的已声明和合成属性,objective-c,ios,core-data,properties,uiapplicationdelegate,Objective C,Ios,Core Data,Properties,Uiapplicationdelegate,我的应用已经在dev下运行了几个月,现在我被要求添加核心数据。SMH。这是一个tabViewController应用程序。我不知道这对答案是否有帮助 所以在这里我试图添加它,我得到了错误。我在AppDelegate.h中为核心数据构建,因此我创建了这些IVAR,并在.m中稍后适当地构建它们 @property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext; @property (readonl

我的应用已经在dev下运行了几个月,现在我被要求添加核心数据。SMH。这是一个tabViewController应用程序。我不知道这对答案是否有帮助

所以在这里我试图添加它,我得到了错误。我在AppDelegate.h中为核心数据构建,因此我创建了这些IVAR,并在.m中稍后适当地构建它们

@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
在需要CoreData交互的ViewController中,我给出了它们(在.h文件中):

并在.m中合成了它们:

@synthesize fetchedResultsController = __fetchedResultsController;
@synthesize managedObjectContext = __managedObjectContext;
现在,回到AppDelegate。在.m中,当我尝试将managedObjectContext的指针从委托传递到视图时(如下所示):

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

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


我甚至尝试过退出并重新启动XCode。也许是系统重启 首先,如果应用程序已经在没有CoreData的情况下创建了
,那么使用UIManagedDocument来设置核心数据就更容易了

因此,我会在AppDelegate中首先执行此操作。请参阅apple开发者网站上的UIManagedDocument类参考,以及我的答案,以获取帮助:

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

所以我忘记了确切的代码,但它是这样的:

// 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.
希望这对你有帮助

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

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

AppDelegate *delegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];  
self.managedObjectContext = delegate.managedObjectContext;
通常在viewDidLoad中。”


感谢用户:答案是

控制器头文件是否正确导入?是的,该应用已经在开发中使用了几个月,使用了相同的ViewController,并且构建和运行良好(除了设置属性)。首先,我想问您为什么要尝试设置属性,这些属性可能是只读的,也可能不是只读的。为了合并CoreData,我使用CoreData创建了一个新项目,并查看创建了什么。我认为这种方式是将CoreData添加到我的项目中最安全的方式,因为这是苹果的默认方式。它们不是只读的。您能否通过这些错误进行构建?无论是否使用UIManagedDocument,下面的代码仍然无法工作。似乎我甚至不能用一个公共方法来设置它。如果你能提供更好的解决方案,我会再次确认你的答案!提前谢谢
Property 'managedObjectContext' not found on object of type 'UIViewController *'
// 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.
AppDelegate *delegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];  
self.managedObjectContext = delegate.managedObjectContext;