重新加载CollectionView不会清除先前加载的单元格。
重新加载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]; } }
问题的原因是在使用CollectionView时,重新加载数据时不会清除先前加载的单元格。解决方法是在添加新对象之前使用[array_name removeAllObjects];
方法来清除数组中的所有对象。如果数据是存储在CoreData实体中,需要清除CoreData中的数据。
通过使用NSMutableArray
的removeAllObjects
方法可以清除数组中的所有对象。在添加新对象之前,使用这个方法来清除数组中的所有对象。
对于使用CoreData来存储数据的情况,需要注意清除CoreData中的先前搜索结果。可以通过在问题中添加更新来解决这个问题。
通过使用[array_name removeAllObjects];
方法来清除数组中的所有对象,可以解决重新加载CollectionView时不清除先前加载的单元格的问题。对于使用CoreData来存储数据的情况,需要注意清除CoreData中的先前搜索结果。