Ios 如何在UICollectionView重新加载时保留UISearchBar FirstResponder状态?

Ios 如何在UICollectionView重新加载时保留UISearchBar FirstResponder状态?,ios,swift,uicollectionview,uisearchbar,first-responder,Ios,Swift,Uicollectionview,Uisearchbar,First Responder,自定义UIViewController包含UICollectionView。应将ui搜索栏放置在collectionView的最顶端,并滚动其内容。如果用户在内容中输入搜索文本,则在搜索栏保留其第一响应者状态的同时,collectionView应更新 一件非常容易的事情,似乎很容易实现。 我还发现了其他一些关于这类问题的话题,但它们都有好几年的历史了,而且所提出的解决方案都不起作用我想知道2020年使用Xcode 11和iOS 13解决这个问题的最佳解决方案是什么。 什么不起作用: 我已将UI

自定义
UIViewController
包含
UICollectionView
。应将
ui搜索栏
放置在collectionView的最顶端,并滚动其内容。如果用户在内容中输入搜索文本,则在搜索栏保留其第一响应者状态的同时,collectionView应更新

一件非常容易的事情,似乎很容易实现。

我还发现了其他一些关于这类问题的话题,但它们都有好几年的历史了,而且所提出的解决方案都不起作用我想知道2020年使用Xcode 11和iOS 13解决这个问题的最佳解决方案是什么。

什么不起作用:

  • 我已将
    UISearchBar
    添加到第一节的标题中。重新加载完整的contentView或其部分时,搜索栏将释放firstResponder,键盘将被关闭
  • 我已将
    ui搜索栏
    作为子视图添加到collectionView,并使用collectionViews contentOffset将内容放置在搜索栏下方。尽管搜索栏是CollectionVie动态视图层次结构的一部分,但问题与以前相同:重新加载完整的contentView或其部分时,搜索栏会松开第一响应器,键盘会被关闭
  • 我在collectionView中添加了一个extras部分,它只显示其标题(包括搜索栏),而不显示内容。当重新加载其他部分但保留此“搜索部分”时,键盘将被关闭
  • 无论是否使用
    collectionView.performBatchUpdates
    ,都没有区别
  • 在collectionView或其部分完成后重置firstResponder状态。但是,在这种情况下,键盘会被关闭,并立即重新出现。这种方式不可能快速打字,而且键盘的闪烁非常烦人

有什么已知的干净方法可以解决这个问题吗?与此同时,我找到了一个适合我的解决方案。也许这对其他人也有帮助:

我已经将搜索栏作为附加子视图添加到collectionView,并使用contentInsets将实际内容移动到它下面。此解决方案的问题是,在调用
collectionView.reloadData()
时,搜索栏失去了其第一响应程序状态,键盘也消失了

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

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

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

好的,但在我看来,整个界面,集合视图中的搜索栏,就是问题所在。这就是糟糕的界面。将搜索栏放在导航栏中(或将其用作顶部栏)。我希望搜索栏首先隐藏(滚动到导航栏下方),只有在向上滚动时才可见。此外,滚动条应与contentView一起滚动。自定义ViewController中的所有内容,而不是CollectionViewController中的所有内容。如果不将搜索栏放在collectionView中,那有什么可能呢?但是,在CollectionView(单元格)中放置文本字段或其他输入时也会出现同样的问题。