【问题标题】:UICollectionView reloadData resigns first responder/dismisses keyboard when searchBar is in section header当 searchBar 在部分标题中时,UICollectionView reloadData 辞职第一响应者/关闭键盘
【发布时间】:2013-09-14 11:23:38
【问题描述】:

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

【问题讨论】:

标签: ios objective-c cocoa-touch uicollectionview uisearchbar


【解决方案1】:

您是否尝试过使用其中一个选项?

仅重新加载新项目

    [self.collectionView reloadItemsAtIndexPaths:indexPaths];

重新加载完整部分

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

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

    [self.collectionViewPackages performBatchUpdates:^{
        [self.collectionView reloadData];
    } completion:^(BOOL finished) {
        [self.searchBar becomeFirstResponder];
    }];

【讨论】:

  • 使搜索栏第一响应者重新加载实际上仅适用于 iOS7.0,但奇怪的是不适用于 iOS7.1。
【解决方案2】:

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

所以:

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

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

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

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

【讨论】:

  • 这是在您的 colletionView 中实现搜索栏或文本输入字段以过滤数据源的最佳方式。谢谢
  • 现在,这是最智能的解决方案。谢谢先生。
  • 太棒了。谢谢!
  • 你有可以演示的项目吗?我在我的眼球试图让它发挥作用。特别是因为我也在为我的所有项目和标题使用自定义布局属性。每行项目都是在各自的部分中创建的。所以每个部分有 1 行。作为测试,我为我键入的每个字符删除 1 个部分,并且没有重新加载。所以我想我会删除每个部分,然后插入新的部分,但这会导致重新加载!也许你可以看看github.com/pavankataria/SwiftDataTables 的过滤分支?我将不胜感激。
  • 不幸的是,通过sectionHeadersPinToVisibleBounds将搜索栏保持在顶部是不可能的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多