iphone - NSFetchedResultsController 在彼此之上创建重复的单元格

标签 iphone objective-c ios xcode

所以我使用 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;

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

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

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

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

更新 2 似乎还有更多的事情要做。最后 6 个单元格甚至不被 NSFRC 识别,尽管它们已显示。当我按下“编辑”按钮时,除了最后 6 个应用程序之外,所有应用程序都会向右移动(正如它们应该的那样)。发生了大量奇怪的行为。我的 willDisplayCell 中的 NSLog 似乎会持续很多次,即使 TableView 没有滚动。

更新3好吧,我设置部分的代码肯定是问题所在。只需注释掉所有内容即可正常工作。以下是我为每个实体设置部分的方法:

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 进入超速状态并导致多个故障。

最佳答案

已修复。归根结底是愚蠢的错误。我忘记重新加载 TableView!

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
    [self.tableView endUpdates];
    [self.tableView reloadData];
}

关于iphone - NSFetchedResultsController 在彼此之上创建重复的单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14182396/

相关文章:

iphone - 在界面生成器中构建可拉伸(stretch)图像

ios - NSPredicate 无法解析格式字符串

iOS:如何移动球

ios - swift :键盘行为。为什么 'touchesBegan'使用scrollView时不最小化键盘?

iPhone 游戏保存

ios - 通过滑动手指按下按钮(用于钢琴效果)

ios - 未针对iOS 13( objective-c )调用didRegisterForRemoteNotificationsWithDeviceToken

ios - 如何禁用 native 调用屏幕中的消息选项?

ios - OpenCV - 无法访问 Mat 中的所有像素

iphone - 用第三个纹理对两个纹理进行插值(因素是亮度,而不是 alpha)