如何在故事板中的多个视图之间传递对象,iOS Dev

我已经search了这个,但答案太简单,无法满足我:(

我想从TabBarController传递一个NSManagedObjectContext几乎在我的应用程序中的每个视图控制器。 具体来说,我的故事板结构是这样的:

TabBarController >>>几个标签项目视图(这很容易通过,只需要传入一次在视图控制器)。 但是我有另外一个关系: TabBarController (上面提到的那个)>>> NavigationController >>> TableViewControllerOne >>> TableViewControllerTwo

现在是灾难。 因为基本上我必须将NSManagedObjectContext实例从NavigationController转移到TableViewControllerOneTableViewControllerTwo ….这可能涉及到很多prepareSegue:sender ,这并不容易pipe理。

所以我的问题是:在iOS开发中,有没有办法可以创build一个“全局”对象,我可以在整个应用程序中轻松访问? 从使用核心数据的master-detail视图的苹果官方模板,它在应用程序委托中实例化NSManagedObjectContext ,并将其传递给主视图控制器。 如果经过多次查看,必须使用这个对象呢? 哇,这是很多代码。

希望我自己清楚,有人可以帮助:)非常感谢。

就我个人而言,我喜欢使用ModelController类的单例对象,我可以将Core Data堆栈相关的对象(Context,Model和Store Coordinator)和辅助方法放在同一个位置,然后我可以从视图控制器的任何位置访问它们。 像这样的东西:

 @implementation ModelController - (NSManagedObjectModel *)managedObjectModel { // ... return _managedObjectModel; } - (NSPersistentStoreCoordinator *)persistentStoreCoordinator { // ... return _persistentStoreCoordinator; } - (NSManagedObjectContext *)contextForCurrentThread { NSManagedObjectContext *context = [[NSThread currentThread] threadDictionary][@"threadManagedObjectContext"]; if (context == nil) { context = [[NSManagedObjectContext alloc] init]; [context setPersistentStoreCoordinator:self.persistentStoreCoordinator]; [[NSThread currentThread] threadDictionary][@"threadManagedObjectContext"] = context; } return context; } - (void)resetCoreDataStack { [[[NSThread currentThread] threadDictionary] removeObjectForKey:@"threadManagedObjectContext"]; self.persistentStoreCoordinator = nil; self.managedObjectModel = nil; } + (ModelController *)sharedModelController { static ModelController *modelController; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ modelController = [[ModelController alloc] init]; }); return modelController; } @end 

我会认真地推荐使用MagicalRecord库来满足CoreData堆栈的要求。

然后你可以做这样的事情:

[NSManagedObjectContext MR_defaultContext];

要么

[NSManagedObjectContext MR_contextForCurrentThread];

首先build立你的CoreData就像下面这样简单:

[MagicalRecord setupCoreDataStackWithAutoMigratingSqliteStoreNamed:@"myDatabase.sqlite"];

我使用下面的共享商店的想法,创build一个单身人士。 对于我在全球范围内存储不同的东西,这已经相当灵活了(代码是从iOS编程大书呆子牧场指南改编的)。

在下面的代码中,我有一个PartStore类,它将始终返回相同的PartStore实例。

为了访问这个实例,只需要在需要访问共享存储的类中包含PartStore.h,并使用类方法检索实例:

 [PartStore sharedStore]; 

然后,您可以访问该类实例中包含的任何属性。

 // PartStore.h #import "PartData.h" @interface PartStore : NSObject @property (nonatomic, strong) PartData *scannedData; + (PartStore *)sharedStore; @end // PartStore.m @implementation PartStore + (PartStore *)sharedStore { static PartStore *sharedStore = nil; if (!sharedStore) { sharedStore = [[super allocWithZone:nil] init]; } return sharedStore; } + (id)allocWithZone:(NSZone *)zone { return [self sharedStore]; } @end