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

Referencia de UIKit Framework:

UISearchController

UISearchResultsUpdating

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.

barra de búsqueda en barra de navegación

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.

busqueda-barra-en-tabla-encabezado-gif busqueda-barra-en-tabla-cabecera

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.
}


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow