iOS
UISearchController
Ricerca…
Sintassi
- UISearchController (searchResultsController: UIViewController?) // Passa nil come parametro se il controller di aggiornamento ricerca visualizza anche il contenuto ricercabile.
- func updateSearchResults (per searchController: UISearchController) // Metodo obbligatorio da implementare quando si adotta il protocollo UISearchResultsUpdating
Parametri
Parametro | Dettagli |
---|---|
UISearchController.searchBar | La barra di ricerca per l'installazione nell'interfaccia. (sola lettura) |
UISearchController.searchResultsUpdater | L'oggetto responsabile dell'aggiornamento del contenuto del controller dei risultati di ricerca. |
UISearchController.isActive | Lo stato presentato dell'interfaccia di ricerca. |
UISearchController.obscuresBackgroundDuringPresentation | Un booleano che indica se il contenuto sottostante è oscurato durante una ricerca. |
UISearchController.dimsBackgroundDuringPresentation | Un booleano che indica se il contenuto sottostante è disattivato durante una ricerca. |
UISearchController.hidesNavigationBarDuringPresentation | Un booleano che indica se la barra di navigazione deve essere nascosta durante la ricerca. |
UIViewController.definesPresentationContext | Un valore booleano che indica se la vista di questo controller di visualizzazione è coperta quando il controller di visualizzazione o uno dei suoi discendenti presenta un controller di visualizzazione. |
UIViewController.navigationItem.titleView | Una vista personalizzata visualizzata al centro della barra di navigazione quando il ricevitore è l'elemento principale in cui può essere posizionata una barra di ricerca. |
UITableViewController.tableView.tableHeaderView | Restituisce una vista accessoria che viene visualizzata sopra la tabella in cui è possibile posizionare una barra di ricerca. |
Osservazioni
Barra di ricerca nel titolo della barra di navigazione
Questo esempio utilizza un controller di ricerca per filtrare i dati all'interno di un controller di visualizzazione tabella. La barra di ricerca è posizionata all'interno della barra di navigazione in cui è incorporata la vista tabella.
Incorporare un UITableViewController
in un UINavigationController
per ottenere UINavigationItem
(che contiene la barra di navigazione). Quindi imposta la classe ViewController personalizzata in modo che erediti da UITableViewController
e adotti il protocollo UISearchResultsUpdating
.
class ViewController: UITableViewController, UISearchResultsUpdating {
let entries = [(title: "Easiest", image: "green_circle"),
(title: "Intermediate", image: "blue_square"),
(title: "Advanced", image: "black_diamond"),
(title: "Expert Only", image: "double_black_diamond")]
// An empty tuple that will be updated with search results.
var searchResults : [(title: String, image: String)] = []
let searchController = UISearchController(searchResultsController: nil)
override func viewDidLoad() {
super.viewDidLoad()
searchController.searchResultsUpdater = self
self.definesPresentationContext = true
// Place the search bar in the navigation item's title view.
self.navigationItem.titleView = searchController.searchBar
// Don't hide the navigation bar because the search bar is in it.
searchController.hidesNavigationBarDuringPresentation = false
}
func filterContent(for searchText: String) {
// Update the searchResults array with matches
// in our entries based on the title value.
searchResults = entries.filter({ (title: String, image: String) -> Bool in
let match = title.range(of: searchText, options: .caseInsensitive)
// Return the tuple if the range contains a match.
return match != nil
})
}
// MARK: - UISearchResultsUpdating method
func updateSearchResults(for searchController: UISearchController) {
// If the search bar contains text, filter our data with the string
if let searchText = searchController.searchBar.text {
filterContent(for: searchText)
// Reload the table view with the search result data.
tableView.reloadData()
}
}
// MARK: - UITableViewController methods
override func numberOfSections(in tableView: UITableView) -> Int { return 1 }
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// If the search bar is active, use the searchResults data.
return searchController.isActive ? searchResults.count : entries.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// If the search bar is active, use the searchResults data.
let entry = searchController.isActive ?
searchResults[indexPath.row] : entries[indexPath.row]
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
cell.textLabel?.text = entry.title
cell.imageView?.image = UIImage(named: entry.image)
return cell
}
}
Barra di ricerca in intestazione Vista tabella
Questo esempio utilizza un controller di ricerca per filtrare le celle in un controller di visualizzazione tabella. La barra di ricerca viene posizionata all'interno della vista dell'intestazione della vista tabella. Il contenuto della vista tabella è sfalsato con la stessa altezza della barra di ricerca in modo che la barra di ricerca sia nascosta all'inizio. Scorrendo oltre il bordo superiore della vista tabella, viene rivelata la barra di ricerca. Quindi, quando la barra di ricerca diventa attiva, nasconde la barra di navigazione.
Incorporare un UITableViewController in un UINavigationController per ottenere UINavigationItem (che contiene la barra di navigazione). Quindi imposta la classe ViewController personalizzata in modo che erediti da UITableViewController e adotti il protocollo UISearchResultsUpdating.
class ViewController: UITableViewController, UISearchResultsUpdating {
let entries = [(title: "Easiest", image: "green_circle"),
(title: "Intermediate", image: "blue_square"),
(title: "Advanced", image: "black_diamond"),
(title: "Expert Only", image: "double_black_diamond")]
// An empty tuple that will be updated with search results.
var searchResults : [(title: String, image: String)] = []
let searchController = UISearchController(searchResultsController: nil)
override func viewDidLoad() {
super.viewDidLoad()
searchController.searchResultsUpdater = self
self.definesPresentationContext = true
// Place the search bar in the table view's header.
self.tableView.tableHeaderView = searchController.searchBar
// Set the content offset to the height of the search bar's height
// to hide it when the view is first presented.
self.tableView.contentOffset = CGPoint(x: 0, y: searchController.searchBar.frame.height)
}
func filterContent(for searchText: String) {
// Update the searchResults array with matches
// in our entries based on the title value.
searchResults = entries.filter({ (title: String, image: String) -> Bool in
let match = title.range(of: searchText, options: .caseInsensitive)
// Return the tuple if the range contains a match.
return match != nil
})
}
// MARK: - UISearchResultsUpdating method
func updateSearchResults(for searchController: UISearchController) {
// If the search bar contains text, filter our data with the string
if let searchText = searchController.searchBar.text {
filterContent(for: searchText)
// Reload the table view with the search result data.
tableView.reloadData()
}
}
// MARK: - UITableViewController methods
override func numberOfSections(in tableView: UITableView) -> Int { return 1 }
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// If the search bar is active, use the searchResults data.
return searchController.isActive ? searchResults.count : entries.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// If the search bar is active, use the searchResults data.
let entry = searchController.isActive ?
searchResults[indexPath.row] : entries[indexPath.row]
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
cell.textLabel?.text = entry.title
cell.imageView?.image = UIImage(named: entry.image)
return cell
}
}
Implementazione
Innanzitutto, fai in modo che la tua classe sia conforme al protocollo UISearchResultsUpdating
.
class MyTableViewController: UITableViewController, UISearchResultsUpdating {}
Aggiungi la proprietà del controller di ricerca:
class MyTableViewController: UTableViewController, UISearchResultsUpdating {
let searchController = UISearchController(searchResultsController: nil)
}
Aggiungi la barra di ricerca:
override func viewDidLoad() {
super.viewDidLoad()
searchController.searchResultsUpdater = self
searchController.hidesNavigationBarDuringPresentation = false
searchController.dimsBackgroundDuringPresentation = false
searchController.searchBar.sizeToFit()
self.tableView.tableHeaderView = searchController.searchBar
}
Infine, implementa il metodo updateSearchResultsForSearchController
che proviene dal protocollo UISearchResultsUpdating
:
func updateSearchResultsForSearchController(searchController: UISearchController) {
}
UISerachController in Objective-C
Delegate: UISearchBarDelegate, UISearchControllerDelegate, UISearchBarDelegate
@property (strong, nonatomic) UISearchController *searchController;
- (void)searchBarConfiguration
{
self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
self.searchController.searchBar.delegate = self;
self.searchController.hidesNavigationBarDuringPresentation = NO;
// Hides search bar initially. When the user pulls down on the list, the search bar is revealed.
[self.tableView setContentOffset:CGPointMake(0, self.searchController.searchBar.frame.size.height)];
self.searchController.searchBar.backgroundColor = [UIColor DarkBlue];
self.searchController.searchBar.tintColor = [UIColor DarkBlue];
self.tableView.contentOffset = CGPointMake(0, CGRectGetHeight(_searchController.searchBar.frame));
self.tableView.tableHeaderView = _searchController.searchBar;
_searchController.searchBar.delegate = self;
_searchController.searchBar.showsCancelButton = YES;
self.tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(resetSearchbarAndTableView)];
[self.view addGestureRecognizer:self.tapGestureRecognizer];
}
- (void)resetSearchbarAndTableView{
// Reload your tableview and resign keyboard.
}
- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar{
// Search cancelled
}
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar{
// Implement filtration of your data as per your need using NSPredicate or else.
// then reload your data control like Tableview.
}