重新加载CollectionView不会清除先前加载的单元格。

6 浏览
0 Comments

重新加载CollectionView不会清除先前加载的单元格。

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

当用户使用搜索栏时,我遇到了清除先前加载的单元格的问题。它只是加载新的单元格并将旧的单元格向下推。这是适用的代码。

- (BOOL) textFieldShouldReturn:(UITextField *)textField {
//这是设置Restkit postObject参数的NSDictionary
    NSArray *objects =[NSArray arrayWithObjects:textField.text, nil];
    NSArray *keys =[NSArray arrayWithObjects: @"query",nil];
    NSDictionary *params = [NSDictionary dictionaryWithObjects:objects forKeys:keys];
    self.search=params;
//这是向服务器发送的POST请求
    [[RKObjectManager sharedManager] postObject:nil path:@"/rest/search?ip=255.255.255.0" parameters:search success:nil failure:nil];
//这是我认为会清除旧的内容并替换为新内容的方法    
    [self.collectionView reloadData];    
    [textField resignFirstResponder];
    return YES; 
}

我参考了这个问题How to remove all items and add new items to UICollectionView?,并且[collectionView reloadData]是被接受的答案。

我选择了这个教程中的textFieldShouldReturn:方法。

我还参考了苹果开发者文库中的Inserting, Deleting, and Moving Section Items,但我不太确定如何实现删除项的方法。

任何帮助都将是非常有帮助的。这显然是一个新手问题,所以代码片段非常有帮助。

更新:

在上面的代码中,在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

0
0 Comments

问题的原因是在使用CollectionView时,重新加载数据时不会清除先前加载的单元格。解决方法是在添加新对象之前使用[array_name removeAllObjects];方法来清除数组中的所有对象。如果数据是存储在CoreData实体中,需要清除CoreData中的数据。

通过使用NSMutableArrayremoveAllObjects方法可以清除数组中的所有对象。在添加新对象之前,使用这个方法来清除数组中的所有对象。

对于使用CoreData来存储数据的情况,需要注意清除CoreData中的先前搜索结果。可以通过在问题中添加更新来解决这个问题。

通过使用[array_name removeAllObjects];方法来清除数组中的所有对象,可以解决重新加载CollectionView时不清除先前加载的单元格的问题。对于使用CoreData来存储数据的情况,需要注意清除CoreData中的先前搜索结果。

0
0 Comments

问题出现的原因:

在调用reloadData之前,需要清空数据源。你之所以遇到这个问题,是因为你用于确定集合视图中项目和节的数量的源仍然包含旧数据。

解决方法:

在调用reloadData之前,清空数据源即可。你可以在调用reloadData之前使用NSLog打印数据源的内容来验证这一点。

这个方法很简单,希望对你有帮助!

0