Sök…


Syntax

  • UISearchController (searchResultsController: UIViewController?) // Pass nil som parameter om sökuppdateringskontrollern också visar det sökbara innehållet.
  • func-uppdateringSearchResults (för searchController: UISearchController) // Obligatorisk metod att implementera vid antagandet av UISearchResultsUpdating-protokollet

parametrar

Parameter detaljer
UISearchController.searchBar Sökfältet som ska installeras i ditt gränssnitt. (read-only)
UISearchController.searchResultsUpdater Objektet som ansvarar för att uppdatera innehållet i sökresultatkontrollern.
UISearchController.isActive Det presenterade läget för sökgränssnittet.
UISearchController.obscuresBackgroundDuringPresentation En boolean som anger om det underliggande innehållet döljs under en sökning.
UISearchController.dimsBackgroundDuringPresentation En booleska som anger om det underliggande innehållet är nedtonat under en sökning.
UISearchController.hidesNavigationBarDuringPresentation En boolean som anger om navigeringsfältet ska döljas när du söker.
UIViewController.definesPresentationContext Ett booleskt värde som indikerar om den här vynkontrollerns vyn täcks när vynkontrollern eller en av dess ättlingar presenterar en vynkontroller.
UIViewController.navigationItem.titleView En anpassad vy som visas i mitten av navigeringsfältet när mottagaren är det översta objektet där en sökfält kan placeras.
UITableViewController.tableView.tableHeaderView Returnerar en tillbehörsvyn som visas ovanför tabellen där en sökfält kan placeras.

Anmärkningar

UIKit-referensreferens:

UISearchController

UISearchResultsUpdating

Sökfält i navigeringsfältets titel

Detta exempel använder en sökkontroller för att filtrera data inuti en tabellvyregulator. Sökfältet placeras i navigeringsfältet som tabellvyn är inbäddad i.

search-bar-in-nav-bar

Bädda in en UITableViewController i en UINavigationController att få UINavigationItem (som innehåller navigeringsfältet). Ställ sedan in vår anpassade ViewController-klass för att ärva från UITableViewController och anta UISearchResultsUpdating protokollet.

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

Sökfält i tabellvyhuvud

I det här exemplet används en sökkontroller för att filtrera cellerna i en tabellvyregulator. Sökfältet placeras i huvudvyn i tabellvyn. Innehållet i tabellvyn kompenseras med samma höjd som sökfältet så att sökfältet först döljs. När du bläddrar upp förbi tabellvyens övre kant avslöjas sökfältet. När sökfältet sedan blir aktivt döljer det navigationsfältet.

search-bar-in-table-header-gif search-bar-in-table-header

Bädda in en UITableViewController i en UINavigationController för att få UINavigationItem (som innehåller navigeringsfältet). Ställ sedan in vår anpassade ViewController-klass för att ärva från UITableViewController och anta UISearchResultsUpdating-protokollet.

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

Genomförande

UISearchResultsUpdating din klass följa UISearchResultsUpdating protokollet.

class MyTableViewController: UITableViewController, UISearchResultsUpdating {}

Lägg till egenskapen för sökkontrollern:

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

Lägg till sökfältet:

override func viewDidLoad() {
    super.viewDidLoad()

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

Och slutligen implementera updateSearchResultsForSearchController metoden som kommer från UISearchResultsUpdating protokollet:

func updateSearchResultsForSearchController(searchController: UISearchController) {

}

UISerachController i Objekt-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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow