2012-04-29 14 views
0

次のコードを使用して、問題のないパスでViewControllerにコンテキストを渡しましたが、何らかの理由でこのプロジェクトで動作が異なっています。私は、次のしているviewDidLoadメソッドでViewControllerにNSManagedObjectContextコンテキストを渡すことはありません

ProjectListViewController *projectListViewController = [[ProjectListViewController alloc] init]; 
projectListViewController.context = [self context]; 
[self.view addSubview:[projectListViewController view]]; 
  • if (_context != nil) { 
    
        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
        NSEntityDescription *entity = [NSEntityDescription 
         entityForName:@"Project" inManagedObjectContext:_context]; 
    
        [fetchRequest setEntity:entity]; 
        NSError *error; 
        self.projects = [_context executeFetchRequest:fetchRequest error:&error]; 
    } 
    
  • それは_contextが判明

    1. ユーザーがアクション
    2. 私はそうのようなのViewControllerをロードを行い、ありません。

    これは私が見つけたものです。

    ViewDidLoadメソッドは、[self.view addSubview:[projectListViewController view]]行に到達する前に実行されます。したがって、コンテキストは設定されません。

    しかし、私はビューの宣言からinitを削除すると、projectListViewController.context = [自己コンテキスト];実行されるので、コンテキストはnilではありません。

    addSubviewが呼び出される前にViewDidLoadが実行されるべきではないと私は間違っていますか?

    コンテキストをViewControllerに渡すより良い方法はありますか?

  • +1

    これは間違っていませんが、NSFetchRequestコードをviewWillAppearに移動するとどうなりますか? –

    +0

    これはうまくいくことを試みましたが、なぜviewDidLoadがaddSubviewの前に呼び出されているのか説明しません。 – Allfocus

    +0

    私は推測がありませんが、viewDidLoadにブレークポイントを入れてスタックを見ると、手がかりがあるかもしれません。 –

    答えて

    0

    -viewDidLoadは、ビューが必要になるまで、つまり表示する必要があるまで、ロードした後には呼び出されません。私は通常、アプリケーションデリゲートに便利なメソッドを置くか、コンテキストを返すシングルトンを配置します。

    +0

    良い提案ですが、私はこの方法を使わないことに決めました。 – Allfocus

    0

    Appleのドキュメントに基づいています。

    ロードサイクルは、ビューコントローラのビュープロパティがアクセスされ、ビューが現在メモリにないときにトリガされます。

    ここで私のViewControllerはinitWithNibNameを呼び出します。それが呼び出す次のメソッドは、ViewControllerがアクセスされた結果としてViewDidLoadです。

    これは、ビューが実際にはまだ追加されていないだけなので、_contextを渡すとViewDidLoadイベントの後に_context nilが発生することを意味します。

    簡単な解決方法は、カスタム化を行うためにinitWithNibNameメソッドを必要としない場合、View Controllerにアクセスしないようにして、ViewDidLoadが呼び出されないようにしてコンテキストを渡し、サブビュー

    私はフィリップが提案したソリューションを使用しますが、その理由を理解したかっただけです。

    関連する問題