2016-01-27 23 views
8

Desidero aggiungere un pulsante "filtro" o "ordina" accanto allo searchBar all'interno di uno UISearchController. Ho già provato a aggiungere UIButton e searchbar a UIView e impostarlo come UITableView tableView.tableHeaderView Questo non funziona perché tableView.tableHeaderView get è impostato su UISearchBar solo quando si chiude il controller. Ecco un esempio di come voglio che appaia: enter image description herePulsante Aggiungi filtro a UISearchController

+0

c'è un motivo particolare che si sta utilizzando un controller di ricerca? sei aperto a non usarlo e filtrare direttamente la vista tabella? – Wain

+0

Il motivo è puramente ottico. Quindi andrei bene con qualsiasi cosa – smnk

+0

dovrei essere più specifico, hai già una vista tabella, sei contento di limitarti a filtrare o stai usando una visualizzazione diversa per presentare i risultati della ricerca/vuoi la capacità di sovrapposizione del controller di ricerca? – Wain

risposta

0

perderei il controller di ricerca, non offre alcuna funzionalità che desideri realmente e la vista aggiuntiva/VC che devi fornire aggiunge complessità/codice duplicazione.

La vista tabella esistente ha già tutto ciò di cui hai bisogno, perché ha un'origine dati. Quello è o un array o un FRC. Se si tratta di un array, è possibile sostituire il contenuto dell'array con i contenuti filtrati e, se si tratta di un FRC, è possibile modificare il predicato.

Nota: nel caso dell'array, sono presenti 2 riferimenti di matrice, 1 che punta a un array contenente tutti gli elementi non filtrati e un altro che è inizialmente un riferimento allo stesso array - il secondo riferimento viene utilizzato per popolare la vista tabella. Quindi, quando si filtra, si crea una nuova matrice con solo gli elementi filtrati e si punta al secondo riferimento.

Invece di implementare il metodo di delega del controller di ricerca, si implementano i metodi di delega della barra di ricerca e si utilizzano per attivare il filtro e ripristinare.

Ora hai eliminato il controller di ricerca anche tu non stai cambiando le visualizzazioni di tabella, quindi hai solo 1 TV e 1 vista di intestazione. Ora non c'è motivo di cambiare la vista dell'intestazione e tutto funziona.

+0

Non ho capito cosa stavo cercando. Non voglio sapere come filtrare un TableView, ma piuttosto come riuscire a ottenere un filtro Pulsante proprio accanto alla barra di ricerca (in un controller di ricerca idealmente) – smnk

+1

Ecco perché ho chiesto di perdere il controller di ricerca. Il problema è che il controller di ricerca presenta una vista diversa, quindi l'intestazione è configurata in modo diverso. Dovresti essere in grado di configurare un'altra intestazione nell'altra vista. Trovo che i controller di ricerca aggiungano solo complessità per pochi vantaggi reali. Se hai solo 1 vista hai 1 header che è semplice da configurare e anche la gestione del focus è semplice. – Wain

3

ho provato molta strada è per personalizzare searchbar ma niente mi ha aiutato finalmente trovato un modo per full-riempire la vostra esigenza

let mysearchController = UISearchController(searchResultsController: nil) 
    mysearchController.searchBar.showsCancelButton = true 
    mysearchController.searchBar.barStyle = UIBarStyle.Black 
    for var subView1 in mysearchController.searchBar.subviews{ 
     for var subView2 in subView1.subviews{ 
      if subView2 .isKindOfClass(UIButton){ 
       let customizedCancelButton:UIButton = subView2 as! UIButton 
       customizedCancelButton.enabled = true 
       customizedCancelButton.setTitle("", forState: UIControlState.Normal) 
       let image1 = UIImage(named: "Sort") 
       customizedCancelButton.setBackgroundImage(image1, forState: UIControlState.Normal) 
       customizedCancelButton.addTarget(self, action: "sort", forControlEvents: UIControlEvents.TouchUpInside) 
      } 
     } 
    } 

sopra il codice è molto semplice da capire.

func sort(){ 
     print("sort button fired!!!") 
    } 

enter image description here

4

Invece di personalizzazione del UISearchBar e complicare le cose, è possibile mantenerlo semplice aggiungendo il tuo pulsante accanto SearchBar.

colori No i Shows annullare pulsante di opzione per SearchBar utilizzando

self.searchBar.showsCancelButton = true 

O

deselezionare Spettacoli annullare pulsante di opzione per SearchBar in StoryBoard

enter image description here

Aggiungi la tua proprio pulsante b eside SearchBar come illustrato di seguito

enter image description here

E quindi di conseguenza aggiungere IBAction al pulsante ed eseguire le vostre azioni in esso.

Anche in casi ideali, non è consigliabile inserire questa vista in Intestazione di tableview. Sarà meglio se è sopra il tableview come anche seguito da Apple.

enter image description here

3

ho potuto creare un filtro di ricerca con poche righe di codice. Spero possa essere d'aiuto.

* Ho scelto il pulsante del segnalibro per applicare l'icona del filtro; perché ho già utilizzato il pulsante Annulla per l'azione personalizzata.

Innanzitutto, è necessario delegare searchBar per gestire l'azione di clic del pulsante del segnalibro. Quindi è necessario impostare le proprietà come di seguito. Se si desidera assegnare una posizione personalizzata (la posizione predefinita è sul lato destro), è necessario impostarePositionAdjustment.

searchController.searchBar.delegate = self 
searchController.searchBar.showsBookmarkButton = true 
searchController.searchBar.setImage(UIImage(named: "Sort.png"), for: .bookmark, state: .normal) 
// MARK: You may change position of bookmark button. 
//searchController.searchBar.setPositionAdjustment(UIOffset(horizontal: 0, vertical: 0), for: .bookmark) 

Quindi, sostituire la funzione searchBarBookmarkButtonClicked all'interno del VC. Puoi gestire l'evento click all'interno di questo metodo.

func searchBarBookmarkButtonClicked(_ searchBar: UISearchBar) { //showAlert, presentVC or whatever you want here }

Inoltre, se si desidera nascondere il pulsante preferito durante regolatore di ricerca è attiva, è necessario applicare il controllo all'interno metodo updateSearchResults.

if searchController.isActive { 
    searchController.searchBar.showsBookmarkButton = false 
} else { 
    searchController.searchBar.showsBookmarkButton = true 
} 

While searchController is not active

searchController is active

+0

Ottima soluzione! Grazie. – Alessign