2011-03-12 9 views
1

私は、親子関係に基づいてNSOutlineViewDataSourceのカスタムまたはのコアデータのエンティティを持つNSOutlineViewを持っています。NSManagedObjectContext = nilは、最初にフェッチしようとした後になぜですか?

これをビューにバインドする簡単な方法はまだ見つかりませんでした。今は、エンティティとそのそれぞれのNSArrayControllersに新しいオブジェクトを挿入した後に、NSOutlineViewに更新するように指示する方法を考え出しています。私はこれと同じ方法で、私はそれが再びゼロからNSOutlineViewを埋めるだろうと考え、エンティティのいずれかにオブジェクトを追加するたびに呼び出してみました

rootNode = [[IFParentNode alloc] initWithTitle:@"Root" children:nil]; 
    NSInteger clientCounter; 
    clientCounter = 0; 
    NSFetchRequest *clientsFetchRequest = [[NSFetchRequest alloc] init]; 
    NSManagedObjectContext *clientsMoc= [clientsController managedObjectContext]; 
    NSEntityDescription *clientsEntity = [NSEntityDescription entityForName:@"Clients" inManagedObjectContext:clientsMoc]; 
    [clientsFetchRequest setEntity:clientsEntity]; 
    //sort 
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"clientCompany" ascending:YES]; 
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
    [clientsFetchRequest setSortDescriptors:sortDescriptors]; 
    NSError *clientsFetchError = nil; 
    clientsArray = [clientsMoc executeFetchRequest:clientsFetchRequest error:&clientsFetchError]; 
    [clientsFetchRequest release]; 

    NSInteger projectCounter; 
    projectCounter = 0; 
    NSFetchRequest *projectsFetchRequest = [[NSFetchRequest alloc] init]; 
    NSManagedObjectContext *projectsMoc= [projectsController managedObjectContext]; 
    NSEntityDescription *projectsEntity = [NSEntityDescription entityForName:@"Projects" inManagedObjectContext:projectsMoc]; 
    [projectsFetchRequest setEntity:projectsEntity]; 
    NSError *projectsFetchError = nil; 
    projectsArray = [projectsMoc executeFetchRequest:projectsFetchRequest error:&projectsFetchError]; 
    [projectsFetchRequest release]; 

    for (NSString *s in clientsArray) { 
     NSManagedObject *clientMo = [clientsArray objectAtIndex:clientCounter]; // assuming that array is not empty 
     id clientValue = [clientMo valueForKey:@"clientCompany"]; 
     //NSLog(@"Company is %@", parentValue); 

     IFParentNode *tempNode = [[IFParentNode alloc] initWithTitle:[NSString stringWithFormat:@"%@", clientValue] children:nil]; 

     clientCounter = clientCounter + 1; 
     [rootNode addChild:tempNode]; 
     [tempNode release]; 
    } 

    for (NSString *s in projectsArray) { 
     NSInteger viewNodeIndex; 
     viewNodeIndex = 0; 
     NSManagedObject *projectMo = [projectsArray objectAtIndex:projectCounter]; // assuming that array is not empty 
     id projectValue = [projectMo valueForKey:@"projectTitle"]; 
     id projectParent = [[projectMo valueForKey:@"projectParent"] valueForKey: @"clientCompany"]; 
     // find if theres an item with the projetParent name 
     id nodeTitle = [[rootNode children] valueForKey:@"title"]; 
     for(NSString *companies in nodeTitle) { 
      if([companies compare:projectParent] == NSOrderedSame) { 
       //NSLog(@"Yeh! Company is %@ and parent is %@ and id is: %d", companies, projectParent, viewNodeIndex); 
       // then assign that node to be the tempnode. 
       IFParentNode *tempNode = [rootNode.children objectAtIndex:viewNodeIndex]; 
       IFChildNode *subTempNode = [[IFChildNode alloc] initWithTitle:[NSString stringWithFormat:@"%@", projectValue]]; 
       [tempNode addChild:subTempNode]; 
       [subTempNode release]; 
       [tempNode release]; 
      } else { 
       // do nothing. 
      } 
      viewNodeIndex = viewNodeIndex + 1; 
     } 
     projectCounter = projectCounter + 1; 
    } 

    [outlineView expandItem:nil expandChildren:YES]; 

NSOutlineViewが持つawakeFromNibで[OK]を移入します。代わりに、それだけでエラーを与える:

+entityForName: could not locate an NSManagedObjectModel for entity name 'Clients' 

clientsMocのログが、それは私が(それがこのために正常に動作します)awakefromnib後にそれを呼び出すたびにnilに等しいだことが明らかになりました。私はこのサイトでこれについていくつか触れてきましたが、自己またはNSAppの代理人はまだ私のために働いていません。私はこれを取るためにどの方向性があるのか​​分かりませんか?私はゼロではないMOCを返す必要があります。

私のappdelegateクラスは、コアデータアプリケーション用に標準設定されたクラスです。

ありがとうございます!

答えて

0

私は、常にappDelegateNSManagedObjectContextに対処することを含めて、Googleでたくさん作物を作っている方法を使ってこれを解決しようと苦労していました。

clientsMoc = [(nameofAppDelegate *)[[NSApplication sharedApplication] delegate] managedObjectContext]; 

これは、clientsMocが呼び出され、nilであることが判明しました。私の質問への実際の答えを得る。私は100%は確信していませんが、私は誤って私のクラスで2つのインスタンスを作成したことが私の場合には信じていると指摘されたhere。私がこれが真実かもしれないと思う理由は、コンソールで時折重複エラーが発生したためです。私のコントローラは後で変更され、この質問は私のプロジェクトとは無関係になりました。

1

報告したエラーはアウトラインとは関係ありません。コアデータエラーです。

エンティティ名が間違っているか、managedObjectコンテキストが初期化されていないか、正しく参照されていません。

+0

ありがとうTechZen。エンティティは確かにそこにありません(私が言ったように、awakeFromNibのNSOutlineViewはコードを含んでいます)。後でこのメソッドを呼び出すと、そのエラーが発生します。より探偵的な仕事から、私はmanagedObjectContextにダウンしていることを99%確信していますが、推奨される解決策のどれも(MOCを引用するときは自己を最初に参照するなどの)トリックを行っていないか、iPhoneの信頼できる回答です。 – biscuitstack

+0

ちょうど追加する:managedObjectContext = nilのチェックはnilとして戻ってくるので、それは確かに私が入っている問題のタイプです。それを解決する方法は私が問題を抱えています。私は、MOCがメソッドを複数回呼び出す際にokをロードしていることを保証するために、上記のコードのどの部分を除外または追加するのかは不明です。また、なぜ私は最初の目覚めでうまく動いているのか分かりません。 – biscuitstack

+0

managedObjectContextへの参照が失われているようです。私はそれがアプリケーションデリゲートのようないくつかのクラスのプロパティだと仮定します。プロパティがオブジェクトを保持していることを確認します。コントローラのプロパティに渡す場合は、コントローラのプロパティも保持するようにしてください。アクセサーや 'self.projectsMoc'参照フォームを使用しないように注意してください。そうすれば、問題になるかもしれません。 – TechZen

関連する問題