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

时间:2013-06-26 03:47:21

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

我有一个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:方法。 我在apple开发者库中也引用了Inserting, Deleting, and Moving Section Items,但我不太确定如何实现delete items方法。

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

更新 以下是我如何使用它。

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

- (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

2 个答案:

答案 0 :(得分:2)

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

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

希望这有帮助!

答案 1 :(得分:2)

如果您使用的是NSMutableArray,那么您只需执行以下操作:

[array_name removeAllObjects];

在向阵列添加新对象之前执行此操作。