2

所以我使用 NSFRC 来填充我的 UITableView。在cellForRowAtIndexPath我使用以下方法从 Core Data 加载每个单元格的信息:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"myProto"];
[self configureCell:cell atIndexPath:indexPath];

configureCell然后使用标签填充 50% 的单元格,例如:

MyEntity *myEntity = [self.fetchedResultsController objectAtIndexPath:indexPath];
UILabel *nameLabel = (UILabel *)[cell viewWithTag:1001];
nameLabel.text = myEntity.entityName;

对于所有其他标签和图像视图,这将继续。当这一切发生时,字典中会填充来自服务器的信息。然后使用该信息填充剩余 50% 的单元格,再次以cellForRowAtIndexPath. 在 中willDisplayCell,我根据保存在 Core Data 中的信息和从 Internet 下载的信息进行的计算,进行了一些影响诸如文本颜色之类的次要事物的计算。另外,willDisplayCell我会检查是否所有信息都已从互联网下载。如果有,我会循环浏览获取的结果并更改一个Attribute被调用的sectionsSort基于与之前所做的完全相同的计算。换句话说,一旦加载完成,TableView 会进行计算以确定特定单元格应该进入哪个部分。NSFRC 然后对 UITableView 进行排序,将所有内容放入正确的部分。

我知道这个过程有点不确定,因为我们在加载所有内容后设置部分。我已尽最大努力妥善处理所有事情,例如,在这一切进行时,我不允许用户进行任何交互,并且我仅在从 Internet 下载所有内容后才设置部分信息。然而,我显然没有考虑到一些事情,因为 NSFRC 似乎在彼此之上创建重复的单元格。我可以说出来,因为在几个单元格上有一个半透明的背景,由于重叠而变得加倍强烈。它们似乎来去匆匆,具体取决于您在 TableView 中的位置,并且会导致多个故障。我显然在某处错误地使用了 NSFRC,但我只是不知道在哪里。

如果您能帮我诊断这个问题,我将不胜感激。
问候,
迈克

更新:认为我刚刚发现了一个潜在的原因。在viewDidAppear我设置每个实体的部分。似乎每次我保存实体 NSFRC 都会重新创建屏幕上的行。这是一个正确的推论吗?

更新 2似乎还有更多的东西。NSFRC 甚至无法识别最后 6 个单元格,即使它们已显示。当我按下编辑时,除了最后 6 个之外,所有应用程序都向右移动(它们应该如此)。有一大堆奇怪的行为正在发生。我的 NSLog inwillDisplayCell似乎持续了很多次,即使 TableView 没有滚动。

更新 3好的,所以我设置 Section 的代码绝对是问题所在。刚刚注释掉了所有它,它工作正常。以下是我为每个实体设置部分的方式:

for (id i in fetchedResultsController.fetchedObjects) {
    myEntity *myEntity = i;
    DownloadResult *downloadResult = [[DownloadResult alloc] init];
    downloadResult = [downloadResultsDictionary objectForKey:myEntity.entityName];

if (condition)
    {
        myEntity.sectionSort = @"2";

        NSError *error;
        if (![self.managedObjectContext save:&error]) {
            NSLog(@"Error: %@", error);
            FATAL_CORE_DATA_ERROR(error);
            return;
        }
    } 
else if (...

我这样做的方式显然有问题,因为它使 NSFRC 进入超速状态并导致多个故障。

4

1 回答 1

3

固定的。愚蠢的错误在一天结束时。我忘记重新加载 TableView!

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
    [self.tableView endUpdates];
    [self.tableView reloadData];
}
于 2013-01-06T14:11:51.410 回答