#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 (ячейки).