我有UICollectionView
有节标题。在标题标题中,我有一个UISearchBar
。我想在搜索栏中输入时过滤我的集合视图中的内容。我使用以下方法执行此操作:
// The method to change the predicate of the FRC
- (void)filterContentForSearchText:(NSString*)searchText
{
NSString *query = searchText;
if (query && query.length) {
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains[cd] %@ or createdAt contains[cd] %@ or noteText contains[cd] %@ or keywords contains[cd] %@", query, query, query, query];
[self.fetchedResultsController.fetchRequest setPredicate:predicate];
} else {
[self.fetchedResultsController.fetchRequest setPredicate:nil];
}
NSError *error = nil;
if (![[self fetchedResultsController] performFetch:&error]) {
// Handle error
NSLog(@"Error");
}
[self.collectionView reloadData];
}
每次搜索栏文本更改时都会调用此方法。 [self.collectionView reloadData]
行隐藏了每个角色的键盘。是否可以仅重新加载UICollection视图中的数据而不重新加载补充视图,如节标题标题?
我的collectionView中的数据来自NSFetchResultController。
我很满意我的UI如何工作,所以如果有一种简单的方法可以不重新加载节标题,那就太棒了!
答案 0 :(得分:24)
在尝试了许多不同的选择后,我终于弄明白了。解决方案是使您自己的部分标题,以便您可以独立重新加载其他部分,而无需重新加载标题附加到的部分。
所以:
然后,我们需要重新加载您的数据:
[collectionView reloadSections:[NSIndexSet indexSetWithIndex:1]];
您的搜索栏或文本字段应在用户输入时保持其焦点,您可以在后台更新结果。
答案 1 :(得分:4)
你尝试过其中一个选项吗?
仅重新加载新项目
[self.collectionView reloadItemsAtIndexPaths:indexPaths];
重新加载完整部分
[self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:0]];
或者,如果它不起作用..在更新后再次使searchBar第一响应者
[self.collectionViewPackages performBatchUpdates:^{
[self.collectionView reloadData];
} completion:^(BOOL finished) {
[self.searchBar becomeFirstResponder];
}];