Как добавить панель поиска над UICollectionView?

Я хочу, чтобы пользователи моего приложения могли искать изображения с помощью UISearchBar выше UICollectionView. По моему мнению, UICollectionView должен быть в UICollectionViewController для правильной работы. Однако Xcode не позволит мне помещать строку поиска в UICollectionViewController. Я также не могу использовать общий UIViewController, поскольку представление коллекции не будет работать должным образом. Как я могу достичь желаемой функциональности?

Ответ 1

CollectionView + SearchBar с реализацией Swift3 + Storyboard.

Создание заголовка:

Создание заголовка

Создание панели поиска:

Создание панели поиска

Создать пользовательский класс с возможностью повторного использования

Создать пользовательский класс многоразового просмотра

Задайте класс пользовательского класса многократного использования

Установить пользовательский класс многоразового представления

Создать выход в строку поиска

Создать выход в строке поиска в пользовательском классе

Trick: Подключите делегат панели поиска к классу COLLECTION VIEW, выход в строку поиска появится в CUSTOM REUSABLE VIEW CLASS

Подключить делегат панели поиска к классу коллекционного вида

Внедрить метод заголовка CollectionView протокола

    override func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {

         if (kind == UICollectionElementKindSectionHeader) {
             let headerView:UICollectionReusableView =  collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "CollectionViewHeader", for: indexPath)

             return headerView
         }

         return UICollectionReusableView()

    }

Установите делегат панели поиска

    class MyCollectionViewController: (other delegates...), UISearchBarDelegate {

И, наконец, ваши методы делегирования панели поиска будут вызваны в вашем классе CollectionView

//MARK: - SEARCH

func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
    if(!(searchBar.text?.isEmpty)!){
        //reload your data source if necessary
        self.collectionView?.reloadData()
    }
}

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    if(searchText.isEmpty){
        //reload your data source if necessary
        self.collectionView?.reloadData()
    }
}

Ответ 2

Не обязательно иметь UICollectionView внутри UICollectionViewController. UICollectionView аналогичен UITableView и может быть добавлен в любом месте. Все, что вам нужно сделать, это реализовать протоколы UICollectionViewDelegate и UICollectionViewDataSource. Вы можете следовать следующему руководству Дополнительный заголовок и добавить строку поиска в качестве дополнительного заголовка UICollectionView.