2016-07-13 51 views
5

Desidero consentire agli utenti della mia app di cercare immagini utilizzando uno UISearchBar sopra un UICollectionView. Secondo la mia comprensione, un UICollectionView deve essere in un UICollectionViewController per funzionare correttamente. Tuttavia, Xcode non mi consente di inserire una barra di ricerca in un UICollectionViewController. Inoltre, non è possibile utilizzare un UIViewController generico in quanto la vista raccolta non funzionerà correttamente. Come posso ottenere la funzionalità che voglio?Come posso aggiungere una barra di ricerca sopra un UICollectionView?

+0

trovare il link in basso, questo può aiutare. [esempio-come-integrare-uicollectionview-con-uisearchbar -1] (https://maniacdev.com/2015/01/example-how-to-integrate-uicollectionview-with-uisearchbar) – Chandan

risposta

1

Non è obbligatorio avere UICollectionView all'interno di UICollectionViewController. UICollectionView è come UITableView e può essere aggiunto ovunque. Tutto ciò che devi fare è implementare i protocolli UICollectionViewDelegate e UICollectionViewDataSource. È possibile seguire il seguente tutorial Supplementary Header e aggiungere la barra di ricerca come intestazione supplementare di UICollectionView.

+0

Ho fatto quello ma ricevevo NSExceptions anche se ho implementato UICollectionViewDelegate e UICollectionViewDataSource –

+0

Qual è stata l'eccezione? –

18

CollectionView + SearchBar con Implementazione Swift3 + Storyboard.

Creare l'intestazione Vista:

Creating the Header View

Creazione della barra di ricerca:

Creating the Search Bar

creare la vista riutilizzabile classe personalizzata

Create the reusable view custom class

Impostare la vista riutilizzabile personalizzato classe

Set the reusable view custom class

Creare presa barra di ricerca

Create the search bar outlet in custom class

Trucco: collegare la ricerca bar delegato alla classe di raccolta VIEW, presa barra di ricerca va al VIEW classe personalizzata REUSABLE

Connect the search bar delegate to collection view class

Implementare il metodo intestazione CollectionView del protocollo

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() 

    } 

Impostare il delegato Searchbar

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

E, infine, i vostri metodi delegato barra di ricerca saranno chiamati nel vostro CollectionView Classe

//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() 
    } 
} 
+4

Sfortunatamente questo approccio ha alcuni effetti collaterali; la barra di ricerca apparirà in ogni intestazione della sezione, la barra di ricerca scorrerà fuori dalla vista e la barra di ricerca perderà il suo stato FirstResponder quando viene chiamato self.collectionView? .reloadData(). Dai un'occhiata a Jeremiah-de repo step by step per l'utilizzo di UISearchController con UICollectionView https://github.com/jeremiah-de/CollectionViewSearch/tree/basic-collection-view – aumansoftware