2015-05-15 13 views
7

io sono in grado di creare bar campo di applicazione a UISearchController & impostare i loro titoliCome utilizzare bar portata con UISearchController

resultSearchController = ({ 

     let controller = UISearchController(searchResultsController: nil) 

     controller.searchResultsUpdater = self 

     controller.dimsBackgroundDuringPresentation = false 

     controller.searchBar.showsScopeBar = true 

     controller.searchBar.scopeButtonTitles = ["One", "two", "three"] 

     controller.searchBar.sizeToFit() 

     self.tableView.tableHeaderView = controller.searchBar 


     return controller 

    })() 

Ma come faccio io in realtà sorta usando la barra ambito. Il mio attuale metodo di smistamento è il seguente

func updateSearchResultsForSearchController(searchController: UISearchController) { 

    filteredTableData.removeAll(keepCapacity: false) 

    let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text) 

    let array = (tableData as NSArray).filteredArrayUsingPredicate(searchPredicate) 

    filteredTableData = array as! [String] 

    tableView.reloadData() 

} 
+0

Si prega di fornire maggiori dettagli, quale output vuoi? – Mukesh

+0

se vedi il mio codice sono in grado di impostare i titoli della barra di campo. Voglio ordinare i risultati in base a tre categorie. –

+0

Avete dati in 'tableData' che potrebbero aiutare nel filtraggio usando la barra degli ambiti ?. 'tableData' è solo una serie di stringhe, come sarebbe di aiuto nel filtrare con" uno "," due "o" tre ". –

risposta

0

È necessario aggiungere barra di ricerca delegato come segue.

class NumberTableViewController: UITableViewController, UISearchResultsUpdating, UISearchBarDelegate { 

Salva registro delegato in vista fece carico come segue

resultSearchController.searchBar.delegate = self 

Delegato ha il metodo di dirvi quale pulsante della barra portata viene premuto come segue

func searchBar(searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) { 

    filterArrayWithCharacterLength(selectedScope) 

} 

Per informazioni dettagliate leggi la mia esercitazione su How to add UISearchController to tableView

1

Anche se in ritardo, potrebbe aiutare qualcuno! Supponiamo di avere una persona oggetto e una serie di filteredPeople in cui si tengono le persone che hai filtrato, quindi

struct Person 
{ 
    let name:String 
} 

func updateSearchResultsForSearchController(searchController:UISearchController) 
{ 
    //Start filtering only when user starts to write something 
    if searchController.searchBar.text.length > 0 
    { 
     filteredPeople.removeAll(keepCapacity: false) 
     self.filterContentForSearchText(searchController.searchBar.text) 
     self.tableView.reloadData() 
    } 
    else 
    { 
     self.filteredPeople = self.people 
     self.tableView.reloadData() 
    } 
} 

func filterContentForSearchText(searchText: String) 
{ 
    self.filteredPeople = self.people.filter({(person: Person) -> Bool in 

    //In this case we are searching for all, and the search is case insensitive  
    let categoryMatch = (scope == "All") 
    let stringMatch = person.name.rangeOfString(searchText, options: NSStringCompareOptions.CaseInsensitiveSearch) 
    return categoryMatch && (stringMatch != nil) 
    }) 
} 
+0

Questa risposta mi è molto utile in questo momento per una sola domanda: la variabile "scope" nel metodo filterContentForSearchText(), da dove proviene? non è stato dichiarato da nessuna parte ... –

+1

Mi dispiace per quello! 'lasciare ambiti = self.searchDisplayController.searchBar.scopeButtonTitles come [String]' ' lasciare scope = ambiti [0]' // assumendo che prima ambito è "All", altrimenti si ottiene l'ambito sulla base di indice in caso hai più di un ambito. – Bettimms

+0

Grazie per il suggerimento, ma hai dato mezzo ass tentativo di risolvere il problema. Ecco perché non ti sto dando la risposta. –

Problemi correlati