2013-01-20 85 views
0

在我的代码中,我想创建带有List部分的tableView。我使用的方案是这样一个:核心数据对多关系获取数据

enter image description here

我用NSFetchResultController我这样定义:

- (NSFetchedResultsController *)fetchedResultsController { 

    if (_fetchedResultsController != nil) { 
     return _fetchedResultsController; 
    } 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription 
           entityForName:@"Item" inManagedObjectContext:coreDataController.masterManagedObjectContext]; 
    [fetchRequest setEntity:entity]; 

    NSSortDescriptor *sort = [[NSSortDescriptor alloc] 
          initWithKey:@"addedAt" ascending:YES]; 
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]]; 

    [fetchRequest setFetchBatchSize:20]; 

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"itemIsChecked = 1"]; 

    [fetchRequest setPredicate:predicate]; 
    [fetchRequest setResultType:NSDictionaryResultType]; 

    NSFetchedResultsController *theFetchedResultsController = 
    [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
            managedObjectContext:coreDataController.masterManagedObjectContext sectionNameKeyPath:@"toList.listName" 
               cacheName:nil]; 
    self.fetchedResultsController = theFetchedResultsController; 
    _fetchedResultsController.delegate = self; 

    return _fetchedResultsController; 
} 

现在的cellForRowAtIndexPath:我想要得到的数据形成我的fetchResultController,所以我这样做在方式:

Item *item = [self.fetchedResultsController objectAtIndexPath:indexPath]; 

,然后,如果我想访问该项目的(例如itemText),它坠毁现场之一:

NSLog(@"item itemtext = %@", item.itemText); 

错误:

-[NSKnownKeysDictionary1 itemText]: unrecognized selector sent to instance 0x1215fd90 

我该怎么办错在我的代码?

回答

2

您已设置

[fetchRequest setResultType:NSDictionaryResultType]; 

,因此获取的成果控制器返回NSDictionary对象,而不是Item对象。所以,你的元素

Item *item = [self.fetchedResultsController objectAtIndexPath:indexPath]; 

NSDictionary,不是Item。由于字典没有itemText方法,因此item.itemText崩溃。你可以用

NSDictionary *item = [self.fetchedResultsController objectAtIndexPath:indexPath]; 
NSLog(@"item itemtext = %@", [item objectForKey:@"itemText"]); 

检索字典中的值,但如果你没有一个具体的理由来设置结果类型NSDictionaryResultType,你应该只删除该行。更改对抓取结果控制器的跟踪(即自动表视图更新)不适用于resultType == NSDictionaryResultType

另请注意,如果您已设置sectionNameKeyPath,则必须添加一个具有相同键路径“toList.listName”的排序描述符,并将其用作获取请求的第一个排序描述符。

+0

完美诊断.. +1。 –

+0

很好的答案,谢谢马丁! – edzio27

0

unrecognized selector sent to instance一般由于内存管理不当而发生。检查你是否试图指出一个早些时候发布的对象。同时检查xib中的IBOutlet连接是否为itemText