【问题标题】:Reloading CollectionView does not clear previously loaded cells重新加载 CollectionView 不会清除以前加载的单元格
【发布时间】:2013-06-23 01:39:03
【问题描述】:

我有一个 iOS 应用程序,它利用 RestKit 0.20.1 从 Restful Web 服务检索数据。我还应该添加应用程序使用 CoreData。当应用程序启动时,主屏幕是一个由默认搜索词填充的集合视图。标题中还有一个文本字段,用作搜索栏。

当用户使用搜索栏时,我无法清除之前加载的单元格。它只是加载新的单元格并将以前的单元格向下推。这是适用的代码。

- (BOOL) textFieldShouldReturn:(UITextField *)textField {

//This sets up the NSDictionary for the Restkit postObject parameters
    NSArray *objects =[NSArray arrayWithObjects:textField.text, nil];
    NSArray *keys =[NSArray arrayWithObjects: @"query",nil];
    NSDictionary *params = [NSDictionary dictionaryWithObjects:objects forKeys:keys];
    self.search=params;

//This is the POST request to the server
    [[RKObjectManager sharedManager] postObject:nil path:@"/rest/search?ip=255.255.255.0" parameters:search success:nil failure:nil];

//This is what I thought would clear out the old and replace with the new    
    [self.collectionView reloadData];    

    [textField resignFirstResponder];
    return YES; 
}

我引用了这个问题How to remove all items and add new items to UICollectionView?[collectionView reloadData] 是公认的答案。

我从this 教程中选择了textFieldShouldReturn: 方法。 我还在苹果开发者库中引用了Inserting, Deleting, and Moving Section Items,但我不太确定如何实现删除项方法。

任何帮助都会很棒。这显然是一个菜鸟问题,所以代码 sn-ps 非常有用。

更新: 这是我如何让它工作的。

在上面代码中的postObject 方法和[self.collectionView reloadData] 语句之前添加了对如下所示的deleteAllEntitiesForName 方法的调用。

- (void) deleteAllEntitiesForName:(NSString*)entityName {
    NSManagedObjectContext *moc = [self managedObjectContext];
    NSEntityDescription *entityDescription = [NSEntityDescription
    entityForName:entityName inManagedObjectContext:moc];
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:entityDescription];
    NSError *error = nil;
    NSArray *array = [moc executeFetchRequest:request error:&error];
    if (array != nil) {
        for(NSManagedObject *managedObject in array) {
            [moc deleteObject:managedObject];
        }
        error = nil;
        [moc save:&error];
    }

}

我从这里得到它:Correct way to refresh Core Data database

【问题讨论】:

  • 您的数据是否覆盖在前一个单元格上?
  • 我不这么认为。就好像之前的数据被维护了,新的结果被添加到了collectionView。例如,当应用程序最初加载时,有 10 个单独的单元格,搜索完成后会加载 10 个原始单元格和 10 个新单元格。
  • 为collectionView-cellForItemAtIndexPath放一些cellforrowindexpath的代码。
  • 您需要在重新加载之前检查您的数组计数。
  • 感谢 Abhishek,在我重新加载 collectionView 之前,数组计数没有被重置。你知道在我执行重新加载之前如何清除以前的数据吗?

标签: ios core-data uicollectionview reloaddata restkit-0.20


【解决方案1】:

根据使用UICollectionView(不是使用RestKit)的经验,您可能需要在调用reloadData 之前清除您的数据源。您产生这种效果的原因是您用于确定集合视图中项目和部分数量的源中仍然有旧数据。

验证这一点的简单方法是在调用 reloadData 之前 NSLog 数据源的内容。

希望这会有所帮助!

【讨论】:

  • 绝对有帮助。观察了我的 numberOfItemsInSection: 方法中的计数,并注意到第一次加载是 23,然后在输入搜索后,第一次通过该方法再次是 23,而不是零。然后在循环通过新数据后进入 48。关于如何在重新加载之前清除数据有什么建议吗?
  • 感谢建筑师!在我意识到我的 CoreData 实体坚持原始搜索后,我昨晚遇到了第一个链接。虽然没有找到第二个,但它看起来正是我想要做的。今晚我会试一试并提供更新。
  • 第二个链接很简单。工作得很好,谢谢!
【解决方案2】:

如果您使用的是NSMutableArray,那么您可以这样做:

[array_name removeAllObjects];

在向数组添加新对象之前执行此操作。

【讨论】:

  • 如果您遇到问题,请告诉我。
  • 我不确定是不是那么困难。数据存储在 CoreData 实体中,因此我需要清除它们。不过,感谢您的回复,您的建议让我觉得数据被保存在 CoreData 而不是数组中。
  • Abhishek,感谢您帮助我意识到我的 CoreData 保留了我以前的搜索结果。它现在正在使用我添加到问题中的更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多