Как сохранить статус первого ответчика UISearchBar при перезагрузке UICollectionView?

#ios #swift #uicollectionview #uisearchbar #first-responder

#iOS #swift #uicollectionview #панель поиска uisearchbar #первый ответчик

Вопрос:

Пользователь UIViewController содержит UICollectionView . UISearchBar Следует разместить в самом верху CollectionView и прокручивать его содержимое. Если пользователь вводит текст поиска в содержимое, представление коллекции должно быть обновлено, в то время как панель поиска сохраняет статус первого ответчика.

Что-то довольно простое, что, кажется, удивительно реализовать.

Я нашел несколько других тем, посвященных проблеме, но всем им несколько лет, и ни одно из предложенных решений не сработало. Интересно, какое лучшее решение в 2020 году с использованием Xcode 11 и iOS 13 для решения этой проблемы.

Что НЕ сработало:

  • Я добавил UISearchBar в заголовок первого раздела. При перезагрузке всего contentView или его разделов панель поиска теряет первого ответчика, а клавиатура отключается.
  • Я добавил UISearchBar в качестве подвида в CollectionView и использовал CollectionViews contentOffset для размещения содержимого под панелью поиска. Хотя панель поиска является частью иерархии динамического представления collectionVies, проблема та же, что и раньше: при перезагрузке всего contentView или его разделов панель поиска теряет первого ответчика, а клавиатура отключается.
  • Я добавил раздел «Дополнительные» в CollectionView, в котором отображается только его заголовок (включая панель поиска), а не содержимое. При перезагрузке других разделов, но при сохранении этого «раздела поиска» клавиатура отключается.
  • Не имеет значения, collectionView.performBatchUpdates используется или нет.
  • Сброс статуса первого ответчика после CollectionView или его разделов действительно работает. Однако в этом случае клавиатура отключается и немедленно появляется снова. Быстрый ввод таким образом невозможен, и мигание клавиатуры очень раздражает.

Существует ли какой-либо известный чистый подход для решения этой проблемы?

Ответ №1:

Тем временем я нашел решение, которое работает для меня. Может быть, это также полезно для других:

Я добавил панель поиска в качестве дополнительного подвида в CollectionView и использовал contentInsets для перемещения фактического содержимого под ним. Проблема с этим решением заключалась в том, что при вызове collectionView.reloadData() панель поиска потеряла статус первого ответчика, а клавиатура исчезла.

Итак, перед вызовом collectionView.reloadData() я просто переместил панель поиска в другое представление. Поскольку он больше не является подвидом CollectionView, на него не влияет перезагрузка и он не теряет первого ответчика:

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

Не самое красивое решение, но оно работает.

Комментарии:

1. Хорошо, но мне кажется, что проблема во всем интерфейсе, панели поиска в представлении коллекции. Это просто плохой интерфейс. Поместите строку поиска в панель навигации (или используйте ее как верхнюю панель).

2. Я хочу, чтобы панель поиска сначала была скрыта (прокручивалась под панелью навигации) и становилась видимой только при прокрутке вверх. Кроме того, полоса прокрутки должна прокручиваться вместе с contentView. Все внутри пользовательского ViewController, а не внутри CollectionViewController. Возможно ли это без размещения панели поиска в CollectionView? Однако та же проблема возникает при размещении текстовых полей или других входных данных в CollectionView (ячейки).