iOS
UISearchController
Buscar..
Sintaxis
- UISearchController (searchResultsController: UIViewController?) // Pase nil como parámetro si el controlador de actualización de búsqueda también muestra el contenido que se puede buscar.
- func updateSearchResults (para searchController: UISearchController) // Método requerido para implementar al adoptar el protocolo UISearchResultsUpdating
Parámetros
Parámetro | Detalles |
---|---|
UISearchController.searchBar | La barra de búsqueda para instalar en su interfaz. (solo lectura) |
UISearchController.searchResultsUpdater | El objeto responsable de actualizar los contenidos del controlador de resultados de búsqueda. |
UISearchController.isActive | El estado presentado de la interfaz de búsqueda. |
UISearchController.obscuresBackgroundDuringPresentation | Un valor booleano que indica si el contenido subyacente se oculta durante una búsqueda. |
UISearchController.dimsBackgroundDuringPresentation | Un valor booleano que indica si el contenido subyacente se atenúa durante una búsqueda. |
UISearchController.hidesNavigationBarDuringPresentation | Un valor booleano que indica si la barra de navegación debe estar oculta durante la búsqueda. |
UIViewController.definesPresentationContext | Un valor booleano que indica si la vista de este controlador de vista se cubre cuando el controlador de vista o uno de sus descendientes presenta un controlador de vista. |
UIViewController.navigationItem.titleView | Una vista personalizada que se muestra en el centro de la barra de navegación cuando el receptor es el elemento superior en el que se puede colocar una barra de búsqueda. |
UITableViewController.tableView.tableHeaderView | Devuelve una vista de accesorios que se muestra sobre la tabla en la que se puede colocar una barra de búsqueda. |
Observaciones
Barra de búsqueda en el título de la barra de navegación
Este ejemplo utiliza un controlador de búsqueda para filtrar los datos dentro de un controlador de vista de tabla. La barra de búsqueda se coloca dentro de la barra de navegación en la que está incrustada la vista de tabla.
UITableViewController
un UITableViewController
en un UINavigationController
para obtener el UINavigationItem
(que contiene la barra de navegación). A continuación, configure nuestra clase personalizada ViewController para heredar de UITableViewController
y adopte el protocolo 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 de búsqueda en el encabezado de vista de tabla
Este ejemplo utiliza un controlador de búsqueda para filtrar las celdas en un controlador de vista de tabla. La barra de búsqueda se coloca dentro de la vista de encabezado de la vista de tabla. El contenido de la vista de tabla se desplaza con la misma altura que la barra de búsqueda, de modo que la barra de búsqueda se oculta al principio. Al desplazarse hacia arriba más allá del borde superior de la vista de tabla, se muestra la barra de búsqueda. Luego, cuando la barra de búsqueda se activa, oculta la barra de navegación.
Incruste un UITableViewController en un UINavigationController para obtener el UINavigationItem (que contiene la barra de navegación). A continuación, configure nuestra clase personalizada ViewController para heredar de UITableViewController y adopte el protocolo 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
}
}
Implementación
Primero, haga que su clase cumpla con el protocolo UISearchResultsUpdating
.
class MyTableViewController: UITableViewController, UISearchResultsUpdating {}
Agregue la propiedad del controlador de búsqueda:
class MyTableViewController: UTableViewController, UISearchResultsUpdating {
let searchController = UISearchController(searchResultsController: nil)
}
Añade la barra de búsqueda:
override func viewDidLoad() {
super.viewDidLoad()
searchController.searchResultsUpdater = self
searchController.hidesNavigationBarDuringPresentation = false
searchController.dimsBackgroundDuringPresentation = false
searchController.searchBar.sizeToFit()
self.tableView.tableHeaderView = searchController.searchBar
}
Y finalmente, implemente el método updateSearchResultsForSearchController
que proviene del protocolo UISearchResultsUpdating
:
func updateSearchResultsForSearchController(searchController: UISearchController) {
}
UISerachController en 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.
}