9

アプリデリゲートからビューコントローラーにコンテキストを渡す際に問題が発生します。私はインターネット上で多くのチュートリアルを見つけました、そしてすべてdidFinishLaunchingWithOptionsがビューコントローラを作成し、コンテキストプロパティを設定してそれをプッシュするためにメソッドを使用することを提案します。私の問題は、ストーリーボードを使用したいのですが、ビューコントローラーが作成され、アプリデリゲートではなく、ストーリーボード内にプッシュされます。

私は自分のアプリデリゲートでこれを実行しようとしました:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//instantiate local context
NSManagedObjectContext *context = [self managedObjectContext];
if (!context)
{
    // Handle the error.
    NSLog(@"Error: Context is null");
}

//reference the view controller
helloCoreDataViewController1_001 *rootViewController = [helloCoreDataViewController1_001 alloc];

// Pass the managed object context to the view controller
rootViewController.managedObjectContext = context;

return YES;
}

そしてこれは私のビューコントローラで:

@implementation helloCoreDataViewController1_001

@synthesize name, address, phone, status, managedObjectContext;
//....

- (IBAction)saveContact
{
NSLog(@"name: %@",self.name.text);
NSLog(@"address: %@",self.address.text);
NSLog(@"phone: %@",self.phone.text); 

//Save the new instance of the contact entity
Contact *contact = (Contact *)[NSEntityDescription insertNewObjectForEntityForName:@"Contacts" inManagedObjectContext:managedObjectContext];

[contact setContactName:[NSString stringWithFormat:@"%@",self.name.text]];
[contact setValue:self.address.text forKey:@"address"];
[contact setContactPhone:[NSString stringWithFormat:@"%@",self.phone.text]];

NSError *error = nil;

if (![managedObjectContext save:&error])
{
    // Handle the error.
    NSLog(@"error: %@", error.description);
    self.status.text = @"Error: contact NOT saved";
}
else
    self.status.text = @"Contact saved";
}

デバッグすると、アプリデリゲートでコンテキストが正しく入力され、ViewControllerのプロパティも正常であることがわかります。しかし、私のsaveContactメソッドが呼び出されると、コンテキストは空になります。

これについて何か提案はありますか?ストーリーボードを使用してコンテキストをViewControllerに渡すにはどうすればよいですか?

4

2 に答える 2

9

ストーリーボードの rootviewcontroller は didFinishLaunchingWithOptions にアクセスすることで取得できます。

self.window.rootViewController

新しいものを割り当てる代わりに。

したがって、didFinishLaunchingWithOptions の 2 行は次のようになります。

helloCoreDataViewController1_001 *rootViewController = (helloCoreDataViewController1_001 *)self.window.rootViewController;
rootViewController.managedObjectContext = context;
于 2011-12-05T07:03:31.117 に答える
-1

マネージド オブジェクト コンテキストをビュー コントローラーに渡す代わりに、appDelegate からビュー コントローラーで取得してみてください。

- (NSFetchedResultsController *)fetchedResultsController
{
    if (fetchedResultsController != nil) {
        return fetchedResultsController;
    }
if (managedObjectContext == nil) {
    id appDelegate = (id)[[UIApplication sharedApplication] delegate]; 
    self.managedObjectContext = [appDelegate managedObjectContext];
    }... //finish your fetch request of course...
}

私と一緒にそれは美しく働きました

于 2011-11-28T00:09:00.887 に答える