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: Pulsante Aggiungi filtro a UISearchController
risposta
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.
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
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
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!!!")
}
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
Aggiungi la tua proprio pulsante b eside SearchBar come illustrato di seguito
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.
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
}
Ottima soluzione! Grazie. – Alessign
c'è un motivo particolare che si sta utilizzando un controller di ricerca? sei aperto a non usarlo e filtrare direttamente la vista tabella? – Wain
Il motivo è puramente ottico. Quindi andrei bene con qualsiasi cosa – smnk
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