0

次のコードを使用して、問題なくパスの ViewController にコンテキストを渡しましたが、何らかの理由で、このプロジェクトでは動作が異なります。

  1. ユーザーがアクションを実行します
  2. 次のように ViewController をロードします。

    ProjectListViewController *projectListViewController = [[ProjectListViewController alloc] init]; 
    projectListViewController.context = [self context];
    [self.view addSubview:[projectListViewController view]];
    
  3. viewDidLoad メソッドには次のものがあります。

    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];
    }
    
  4. _context が nil であることがわかりました。

デバッグを行い、これが私が見つけたものです。

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

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

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

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

4

2 に答える 2

0

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

于 2012-04-29T13:57:59.633 に答える
0

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

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

私のViewControllerはinitWithNibNameを呼び出します。次に呼び出すメソッドは、ViewController へのアクセスの結果として ViewDidLoad です。

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

簡単な解決策は、カスタマイズを行うために initWithNibName メソッドを必要としない場合、ビュー コントローラーにアクセスしないように削除することです。そのため、コンテキストを渡してサブビューとして追加する前に ViewDidLoad が呼び出されません。

Philip が提案したソリューションを使用しますが、その理由を理解したいだけです。

于 2012-05-01T12:49:51.190 に答える