3

CoreDataを使用していて、ファイルに設定NSManagedObjectContextAppDelegateます。

ナビゲーションツリーの多くのレベルにあるViewControllerでそのmanagedObjectContextを取得する必要があります。明らかに、私はそれをすべてのinitメソッドに渡したくありません。

試し[[[UIApplication sharedApplication] delegate] managedObjectContext];ましたが、このエラーが発生します「セレクター'managedObjectContext'の既知のインスタンスメソッドがありません

誰かがmanagedObjectContextAppDelegateをこれに取得する方法を教えてもらえますViewContollerか?

4

2 に答える 2

14

AppDelegate.hまず、次のようなプロパティを作成する必要があります。

@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext; // or strong if you ARC instead of retain

を使用readonlyすると、コンテキストを外部から変更できなくなります。

次のようにAppDelegate.m合成します。

@synthesize managedObjectContext;

常にAppDelegate.mオーバーライド内で次のようなgetterメソッド

- (NSManagedObjectContext *)managedObjectContext
{    
    if (managedObjectContext != nil) return managedObjectContext;

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil) {

        managedObjectContext = [[NSManagedObjectContext alloc] init];
        [managedObjectContext setPersistentStoreCoordinator:coordinator];
    }
    return managedObjectContext;
}

完了すると、managedObjectContextどこからでもアクセスできるプロパティがあります。

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSManagedObjectContext* context = appDelegate.managedObjectContext;

よりクールなアプローチはAppDelegate.h、次のようにクラスメソッドを作成することです。

+ (AppDelegate *)sharedAppDelegate;

次にAppDelegate.m、次のようにします。

+ (AppDelegate *)sharedAppDelegate
{
    return (AppDelegate *)[[UIApplication sharedApplication] delegate];
}

AppDelegateこれで、どこでも、ヘッダー( )をインポートする前に#import "AppDelegate.h"、次のことができます。

AppDelegate* appDelegate = [AppDelegate sharedAppDelegate];
NSManagedObjectContext* context = appDelegate.managedObjectContext;

ノート

このようなアプローチを使用すると、アプリケーションが厳格になります。この問題を克服するために、MarcusZarraによるiPhoneでのnsmanagedobjectcontext-on-the-iphoneの受け渡しについて読むことをお勧めします。

それが役に立てば幸い。

于 2012-05-18T12:44:33.437 に答える
2

グローバルsharedApplication変数を独自のアプリのAppDelegateクラスにキャストする必要があります。次に例を示します。

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];            
// Now you can access appDelegate.managedObjectContext;

注:#import "AppDelegate.h"このコードを使用する.mファイルに含める必要があります。

于 2012-05-18T12:41:58.710 に答える