2011-12-08 10 views
4

CoreDataを使って遊び始め、CoreDataを使って新しいプロジェクトを作り、それらの基礎を自分のプロジェクトに組み込み始めました。私は多かれ少なかれ新鮮なプロジェクトを複製した段階に達しましたが、エラーが発生しています。CoreData UITableViewController managedObjectContextエラー

この行、controller.managedObjectContext = self.managedObjectContext;は私に問題を引き起こしています。私は行が含まれている場合、私はそれをコメントアウトすると、アプリは、単に空白のUITableViewで起動し、しかし、それはこのエラーが発生します。私は、あなたはもう見てコードが必要

Universal[24718:707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UITableViewController setManagedObjectContext:]: unrecognized selector sent to instance 0x1521a0' 
*** First throw call stack: 
(0x344558bf 0x346a51e5 0x34458acb 0x34457945 0x343b2680 0x2413 0x378367eb 0x378303bd 0x377fe921 0x377fe3bf 0x377fdd2d 0x30c30df3 0x34429553 0x344294f5 0x34428343 0x343ab4dd 0x343ab3a5 0x3782f457 0x3782c743 0x2331 0x22c8) 
terminate called throwing an exception 

、私はそれを提供することができ、私は願っています何が起きているのか考えています。私はこれを引き起こす何も見ることができません、私はエラーを取得していませんが、私はその行がアプリ全体をクラッシュさせるようにこのログを取得します。

新しいデベロッパーのdidFinishLaunchingWithOptionsメソッドは、新しくコアデータプロジェクトと同じように存在します。

テーブルビューコントローラの要求、ヘッダファイルとして:

#import <UIKit/UIKit.h> 

#import <CoreData/CoreData.h> 

@interface myTableViewController : UITableViewController <NSFetchedResultsControllerDelegate> 

@property (strong, nonatomic) NSFetchedResultsController *fetchedResultsController; 
@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext; 

@end 
+0

'controller'クラスのヘッダファイルを表示してください。 – Jim

+0

ヘッダーファイルを追加しました。 –

答えて

6

あなたAppDelegate.mに

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // Override point for customization after application launch. 
    UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController; 
    MasterViewController *controller = (MasterViewController *)navigationController.topViewController; 
    controller.managedObjectContext = self.managedObjectContext; 
    return YES; 
} 

は、管理対象オブジェクトコンテキストが割り当てられているデフォルトCoreDataテンプレートを使用している場合は、エラーを取得している理由を参照してください。あなたの出発点として別のビューを挿入したので、もはやMasterViewControllerではないtopViewController。したがって、認識できないセレクタがインスタンスに送信されました。

1)(それがコードしてください)この

[[[UIApplication sharedApplication] delegate] mainManagedObjectContext]; 

2のようにそれを得る必要ビューで、正しい管理対象オブジェクトコンテキストを割り当てたコードを削除し、:

2つのオプションがありますクラス名)を追加し、managedObjectContextの宣言を追加し、すべてのUIViewControllers間ですべてのアプリケーション全体にNSManagedObjectContextオブジェクトを渡します。

+0

アプリケーションデリゲートシングルトンを介して管理されたオブジェクトコンテキストを共有することは、アーキテクチャを固くするアンチパターンとも呼ばれます。大部分の実装では奨励されるべきではありません。 –

+2

@ tzuchien.chiu正しいパターンを示す独自の回答を作成するか、そうした記事へのリンクを作成すると、より効果的です。 – Tom

2

あなたはNSFetchedResultsControllerまでUIViewController S(またはそのサブクラス)を結ぶいくつかの配線を逃しています。コアデータを有効にして新しいプロジェクトを設定するときは無料で入手できますが、既存のプロジェクトにコアデータを追加する場合は、自分でいくつかのことを結びつける必要があります。

詳細情報については、http://wiresareobsolete.com/wordpress/2009/12/adding-core-data-existing-iphone-projects/

+0

小さなチュートリアルの調整をリンクしたチュートリアルに示しましたが、Interface Builder内でビューのクラスを設定するのを忘れてしまいました。しかし、これは私のテーブルビューコントローラがルートビューであれば機能します。これらの行のうちの1つを変更する必要がありますか? 'UINavigationController * navigationController =(UINavigationController *)self.window.rootViewController; guestListMasterViewController * controller =(guestListMasterViewController *)navigationController.topViewController; controller.managedObjectContext = self.managedObjectContext; ' –

+0

はい、正しいUIViewControllerでmanagedObjectContextを設定する必要があります。あなたが投稿したコードの量があれば、何をすべきか正確には言えませんが、あなたはほとんどそこにいます。 – occulus

+0

私が与えたコードは、topViewControllerではないので、必要なビューのmanagedObjectContextを正しい場所に設定しません。だから私はどのように私はこのビューのコンテキストを取得することができますか、その階層に関係なく不明。 –

2

アプリケーションの構造によって異なります。すべてのコードの前にTabBarViewControllerを使用すると少し違います

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // Override point for customization after application launch. 
    UITabBarController *tabController = (UITabBarController *)self.window.rootViewController; 

    UINavigationController *navigationController = (UINavigationController *)[[tabController viewControllers] objectAtIndex:0]; 
    MasterViewController *controller = (MasterViewController *)[[navigationController viewControllers] objectAtIndex:0]; 
    controller.managedObjectContext = self.managedObjectContext; 

    return YES; 
} 
1

私は同じ問題がありました。私はそれを使用するかどうかにかかわらず、ManagedContextObjectプロパティがルートビューコントローラ(非常に最初のビューコントローラが最初のナビゲーションコントローラに接続されている)に含まれていることを確認して解決しました。ルートビューコントローラの.hの中

:中

@property (nonatomic, strong) NSManagedObjectContext *managedObjectContext; 

。m

@synthesize managedObjectContext; 

私の答えがちょっと落ちてしまったらお詫び申し上げます。私はそれらを理解するために自分自身のために物事をダウンさせる必要があります:)

関連する問題