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

Riferimento del framework UIKit:

UISearchController

UISearchResultsUpdating

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.

Ricerca-bar-in-nav-bar

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.

Ricerca-bar-in-table-header-gif Ricerca-bar-in-table-header

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


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow