Szukaj…


Składnia

  • UISearchController (searchResultsController: UIViewController?) // Podaj zero jako parametr, jeśli kontroler aktualizujący wyszukiwanie wyświetla również treść do przeszukiwania.
  • func updateSearchResults (dla searchController: UISearchController) // Wymagana metoda do wdrożenia podczas przyjmowania protokołu UISearchResultsUpdating

Parametry

Parametr Detale
UISearchController.searchBar Pasek wyszukiwania do zainstalowania w interfejsie. (tylko czytać)
UISearchController.searchResultsUpdater Obiekt odpowiedzialny za aktualizację zawartości kontrolera wyników wyszukiwania.
UISearchController.isActive Prezentowany stan interfejsu wyszukiwania.
UISearchController.obscuresBackgroundDuringPresentation Wartość logiczna wskazująca, czy ukryta treść jest zasłonięta podczas wyszukiwania.
UISearchController.dimsBackgroundDuringPresentation Wartość logiczna wskazująca, czy podstawowa treść jest przyciemniona podczas wyszukiwania.
UISearchController.hidesNavigationBarDuringPresentation Wartość logiczna wskazująca, czy pasek nawigacji powinien być ukryty podczas wyszukiwania.
UIViewController.definesPresentationContext Wartość logiczna wskazująca, czy widok tego kontrolera widoku jest objęty, gdy kontroler widoku lub jeden z jego potomków przedstawia kontroler widoku.
UIViewController.navigationItem.titleView Widok niestandardowy wyświetlany na środku paska nawigacji, gdy odbiornik jest najwyższym elementem, w którym można umieścić pasek wyszukiwania.
UITableViewController.tableView.tableHeaderView Zwraca widok akcesoriów wyświetlany nad tabelą, w której można umieścić pasek wyszukiwania.

Uwagi

Dokumentacja ramowa UIKit:

UISearchController

UISearchResultsUpdating

Pasek wyszukiwania w tytule paska nawigacji

W tym przykładzie zastosowano kontroler wyszukiwania do filtrowania danych w kontrolerze widoku tabeli. Pasek wyszukiwania jest umieszczony wewnątrz paska nawigacji, w którym osadzony jest widok tabeli.

pasek wyszukiwania w pasku nawigacyjnym

Osadź UITableViewController w UINavigationController aby uzyskać UINavigationItem (który zawiera pasek nawigacji). Następnie ustaw naszą niestandardową klasę ViewController, aby dziedziczyła po UITableViewController i UISearchResultsUpdating protokół 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
    }
}

Pasek wyszukiwania w nagłówku widoku tabeli

W tym przykładzie zastosowano kontroler wyszukiwania do filtrowania komórek w kontrolerze widoku tabeli. Pasek wyszukiwania jest umieszczony w widoku nagłówka widoku tabeli. Zawartość widoku tabeli jest przesunięta o tę samą wysokość co pasek wyszukiwania, dzięki czemu pasek wyszukiwania jest najpierw ukryty. Po przewinięciu w górę poza górną krawędź widoku tabeli odsłania się pasek wyszukiwania. Następnie, gdy pasek wyszukiwania staje się aktywny, ukrywa pasek nawigacji.

search-bar-in-table-header-gif pasek wyszukiwania w nagłówku tabeli

Osadź UITableViewController w UINavigationController, aby uzyskać UINavigationItem (który zawiera pasek nawigacji). Następnie ustaw naszą niestandardową klasę ViewController, aby dziedziczyła po UITableViewController i przyjmij protokół 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
    }
}

Realizacja

Po pierwsze, dostosuj swoją klasę do protokołu UISearchResultsUpdating .

class MyTableViewController: UITableViewController, UISearchResultsUpdating {}

Dodaj właściwość kontrolera wyszukiwania:

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

Dodaj pasek wyszukiwania:

override func viewDidLoad() {
    super.viewDidLoad()

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

Na koniec zaimplementuj metodę updateSearchResultsForSearchController , która pochodzi z protokołu UISearchResultsUpdating :

func updateSearchResultsForSearchController(searchController: UISearchController) {

}

UISerachController w 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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow