20

我有一个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 的工作方式非常满意,所以如果有一种简单的方法可以不重新加载节标题,那就太好了!

4

2 回答 2

34

在尝试了许多不同的选项后,我终于想通了。解决方案是制作自己的部分的标题,这样您就可以独立地重新加载其他部分,而无需重新加载标题所附加的部分。

所以:

  • 第 0 节
    • 标题
      • 搜索栏(或其他文本字段)
      • (没有任何)
  • 第 1 节
    • 标题
      • 创建一个空的 UICollectionReusableView 并覆盖 ...sizeForItemAtIndexPath:(NSIndexPath *)indexPath 以返回 CGSizeZero
      • 您最初与第 0 部分一起使用的实际行

然后,我们需要重新加载您的数据:

[collectionView reloadSections:[NSIndexSet indexSetWithIndex:1]];

您的搜索栏或文本字段应在用户键入时保持焦点,并且您可以在后台更新结果。

于 2014-09-11T21:06:34.317 回答
6

你试过这个选项之一吗?

仅重新加载新项目

    [self.collectionView reloadItemsAtIndexPaths:indexPaths];

重新加载完整的部分

    [self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:0]];

或者,如果它不起作用.. 更新后再次让 searchBar 成为第一响应者

    [self.collectionViewPackages performBatchUpdates:^{
        [self.collectionView reloadData];
    } completion:^(BOOL finished) {
        [self.searchBar becomeFirstResponder];
    }];
于 2013-09-10T18:49:56.360 回答