如何在故事板中的多个视图之间传递对象,iOS Dev
我已经search了这个,但答案太简单,无法满足我:(
我想从TabBarController
传递一个NSManagedObjectContext
几乎在我的应用程序中的每个视图控制器。 具体来说,我的故事板结构是这样的:
TabBarController
>>>几个标签项目视图(这很容易通过,只需要传入一次在视图控制器)。 但是我有另外一个关系: TabBarController
(上面提到的那个)>>> NavigationController
>>> TableViewControllerOne
>>> TableViewControllerTwo
,
现在是灾难。 因为基本上我必须将NSManagedObjectContext
实例从NavigationController
转移到TableViewControllerOne
和TableViewControllerTwo
….这可能涉及到很多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