Zoeken…


Syntaxis

  • UISearchController (searchResultsController: UIViewController?) // Geef nul door als parameter als de zoekupdate-controller ook de doorzoekbare inhoud weergeeft.
  • func updateSearchResults (voor searchController: UISearchController) // Vereiste methode om te implementeren bij het gebruik van het UISearchResultsUpdating-protocol

parameters

Parameter Details
UISearchController.searchBar De zoekbalk om in uw interface te installeren. (alleen lezen)
UISearchController.searchResultsUpdater Het object dat verantwoordelijk is voor het bijwerken van de inhoud van de controller voor zoekresultaten.
UISearchController.isActive De gepresenteerde status van de zoekinterface.
UISearchController.obscuresBackgroundDuringPresentation Een Boolean die aangeeft of de onderliggende inhoud is verborgen tijdens een zoekopdracht.
UISearchController.dimsBackgroundDuringPresentation Een Boolean die aangeeft of de onderliggende inhoud grijs is tijdens een zoekopdracht.
UISearchController.hidesNavigationBarDuringPresentation Een Boolean die aangeeft of de navigatiebalk verborgen moet zijn tijdens het zoeken.
UIViewController.definesPresentationContext Een Booleaanse waarde die aangeeft of de weergave van deze weergavecontroller wordt afgedekt wanneer de weergavecontroller of een van zijn nakomelingen een weergavecontroller presenteert.
UIViewController.navigationItem.titleView Een aangepaste weergave weergegeven in het midden van de navigatiebalk wanneer de ontvanger het bovenste item is waarin een zoekbalk kan worden geplaatst.
UITableViewController.tableView.tableHeaderView Retourneert een accessoireweergave die boven de tabel wordt weergegeven waarin een zoekbalk kan worden geplaatst.

Opmerkingen

UIKit Framework Reference:

UISearchController

UISearchResultsUpdating

Zoekbalk in titel van navigatiebalk

In dit voorbeeld wordt een zoekcontroller gebruikt om de gegevens in een tabelweergavecontroller te filteren. De zoekbalk bevindt zich in de navigatiebalk waarin de tabelweergave is ingesloten.

Search-bar-in-nav-bar

Insluiten een UITableViewController in een UINavigationController aan het krijgen UINavigationItem (die de navigatiebalk bevat). Stel vervolgens onze aangepaste ViewController-klasse in om te erven van UITableViewController en UISearchResultsUpdating het UISearchResultsUpdating protocol over.

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

Zoekbalk in de koptekst van de tabelweergave

In dit voorbeeld wordt een zoekcontroller gebruikt om de cellen in een tabelweergavecontroller te filteren. De zoekbalk wordt in de kopweergave van de tabelweergave geplaatst. De inhoud van de tabelweergave wordt verschoven met dezelfde hoogte als de zoekbalk, zodat de zoekbalk eerst wordt verborgen. Wanneer u voorbij de bovenrand van de tabelweergave schuift, wordt de zoekbalk weergegeven. Wanneer de zoekbalk vervolgens actief wordt, verbergt deze de navigatiebalk.

Search-bar-in-table-header-gif Search-bar-in-table-header

Sluit een UITableViewController in een UINavigationController in om het UINavigationItem te krijgen (dat de navigatiebalk bevat). Stel vervolgens onze aangepaste ViewController-klasse in om te erven van UITableViewController en neem het UISearchResultsUpdating-protocol over.

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

Implementatie

UISearchResultsUpdating uw klas eerst voldoen aan het UISearchResultsUpdating protocol.

class MyTableViewController: UITableViewController, UISearchResultsUpdating {}

Voeg de eigenschap zoekcontroller toe:

class MyTableViewController: UTableViewController, UISearchResultsUpdating {
    let searchController = UISearchController(searchResultsController: nil)
}

Voeg de zoekbalk toe:

override func viewDidLoad() {
    super.viewDidLoad()

    searchController.searchResultsUpdater = self
    searchController.hidesNavigationBarDuringPresentation = false
    searchController.dimsBackgroundDuringPresentation = false
    searchController.searchBar.sizeToFit()
    self.tableView.tableHeaderView = searchController.searchBar
}

En ten slotte, implementeer de methode updateSearchResultsForSearchController die afkomstig is van het UISearchResultsUpdating protocol:

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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow