私は、親子関係に基づいて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クラスは、コアデータアプリケーション用に標準設定されたクラスです。
ありがとうございます!
ありがとうTechZen。エンティティは確かにそこにありません(私が言ったように、awakeFromNibのNSOutlineViewはコードを含んでいます)。後でこのメソッドを呼び出すと、そのエラーが発生します。より探偵的な仕事から、私はmanagedObjectContextにダウンしていることを99%確信していますが、推奨される解決策のどれも(MOCを引用するときは自己を最初に参照するなどの)トリックを行っていないか、iPhoneの信頼できる回答です。 – biscuitstack
ちょうど追加する:managedObjectContext = nilのチェックはnilとして戻ってくるので、それは確かに私が入っている問題のタイプです。それを解決する方法は私が問題を抱えています。私は、MOCがメソッドを複数回呼び出す際にokをロードしていることを保証するために、上記のコードのどの部分を除外または追加するのかは不明です。また、なぜ私は最初の目覚めでうまく動いているのか分かりません。 – biscuitstack
managedObjectContextへの参照が失われているようです。私はそれがアプリケーションデリゲートのようないくつかのクラスのプロパティだと仮定します。プロパティがオブジェクトを保持していることを確認します。コントローラのプロパティに渡す場合は、コントローラのプロパティも保持するようにしてください。アクセサーや 'self.projectsMoc'参照フォームを使用しないように注意してください。そうすれば、問題になるかもしれません。 – TechZen