0

在我的代码中,我想创建带有列表部分的 tableView。我使用这样的方案:

在此处输入图像描述

我使用我以这种方式定义的 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

我的代码做错了什么?

4

2 回答 2

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.

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

于 2013-01-20T11:16:20.150 回答
0

unrecognized selector sent to instance通常由于内存管理不善而发生。检查您是否尝试指向之前发布的对象。还要检查 xib 中的 IBOutlet 连接是否为 lable itemText

于 2013-01-20T11:16:13.197 回答