【问题标题】:How to retain UISearchBar FirstResponder status on UICollectionView reload?如何在 UICollectionView 重新加载时保留 UISearchBar FirstResponder 状态?
【发布时间】:2020-12-30 02:07:02
【问题描述】:

自定义UIViewController 包含UICollectionViewUISearchBar 应放置在 collectionView 的最顶部并随其内容滚动。如果用户在内容中输入搜索文本,则 collectionView 应更新,而 searchBar 保持其 FirstResponder 状态。

有些事情似乎很容易实现。

我发现了其他几个涉及某种问题的主题,但它们都是几年前的,并且所提出的解决方案都没有奏效。 我想知道 2020 年使用 Xcode 11 和 iOS 13 解决这个问题的最佳解决方案是什么。

什么不起作用:

  • 我已将UISearchBar 添加到第一部分的标题中。重新加载完整的 contentView 或其部分时,searchBar 会丢失 firstResponder 并关闭键盘。
  • 我已将UISearchBar 作为子视图添加到collectionView 并使用collectionViews contentOffset 将内容放置在搜索栏下方。虽然 searchBar 是 collectionVies 动态视图层次结构的一部分,但问题与之前相同:重新加载完整的 contentView 或其部分时,searchBar 失去 firstResponder 并且键盘被关闭。
  • 我在 collectionView 中添加了一个 extras 部分,它只显示其标题(包括 searchBar)机器人而不是内容。重新加载其他部分但保留此“搜索部分”时,键盘将被关闭。
  • collectionView.performBatchUpdates 使用与否没有区别。
  • 在 collectionView 或其部分工作后重置 firstResponder 状态。但是在这种情况下,键盘会被关闭并立即重新出现。这种方式无法快速打字,而且键盘的闪烁很烦人。

是否有任何已知的干净方法来解决这个问题?

【问题讨论】:

    标签: ios swift uicollectionview uisearchbar first-responder


    【解决方案1】:

    与此同时,我找到了适合我的解决方案。也许它对其他人也有帮助:

    我已将搜索栏作为附加子视图添加到 collectionView 中,并使用 contentInsets 将实际内容移动到其下方。这个解决方案的问题是,当调用 collectionView.reloadData() 时,搜索栏失去了它的 firstResponder 状态并且键盘消失了。

    所以,在调用collectionView.reloadData() 之前,我只是将搜索栏移到了另一个视图。由于它不再是 collectionView 的子视图,因此它不受重新加载的影响,也不会丢失 firstResponder:

    collectionView.superview.addSubview(searchBar)
    collectionView.reloadData()
    collectionView.addSubview(searchBar)
    

    不是最漂亮的解决方案,但它有效。

    【讨论】:

    • 好的,但在我看来,整个界面(集合视图中的搜索栏)都是问题所在。就是界面不好。将搜索栏放在导航栏中(或将其用作顶部栏)。
    • 我希望首先隐藏搜索栏(滚动到导航栏下方),只有在向上滚动时才可见。此外,滚动条应与 contentView 一起滚动。自定义 ViewController 中的所有内容,而不是 CollectionViewController 中的所有内容。如果不将 searchBar 放在 collectionView 中,这有可能吗?但是,在 CollectionView(Cells) 中放置 TextField 或其他输入时会出现同样的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-14
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 2016-09-08
    • 2011-03-19
    • 1970-01-01
    相关资源
    最近更新 更多