如何在故事板,iOS开发中的几个视图之间传递对象

时间:2013-05-16 13:07:43

标签: ios object core-data viewcontroller

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

我想将NSManagedObjectContextTabBarController传递到我应用中的几乎所有视图控制器。详细说来,我的故事板结构有点像这样:

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

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

所以我的问题是:在iOS开发中,有没有一种方法可以创建一个我可以在整个应用程序中轻松访问的“全局”对象?从使用核心数据的主要详细信息视图的apple官方模板中,它实例化app委托中的NSManagedObjectContext,并将其传递给主视图控制器。如果我在几次视图通过后必须使用此对象怎么办?哇,这是很多代码要做的。

希望我清楚明白,有人可以帮忙:) 非常感谢。

3 个答案:

答案 0 :(得分:2)

认真建议使用MagicalRecord库来满足您的CoreData堆栈要求。

然后您可以执行以下操作:

[NSManagedObjectContext MR_defaultContext];

[NSManagedObjectContext MR_contextForCurrentThread];

首先设置CoreData可以很简单:

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

答案 1 :(得分:1)

我使用以下共享商店创意,创建一个单例。这对于我在全球存储不同的东西非常灵活(该代码改编自iOS Programming The Big Nerd Ranch Guide)。

在下面的代码中,我有一个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

答案 2 :(得分:1)

我个人喜欢使用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