iOS
UISearchController
Recherche…
Syntaxe
- UISearchController (searchResultsController: UIViewController?) // Transmet nil comme paramètre si le contrôleur de mise à jour de recherche affiche également le contenu pouvant faire l'objet d'une recherche.
- func updateSearchResults (pour searchController: UISearchController) // Méthode requise pour implémenter lors de l'adoption du protocole UISearchResultsUpdating
Paramètres
Paramètre | Détails |
---|---|
UISearchController.searchBar | La barre de recherche à installer dans votre interface. (lecture seulement) |
UISearchController.searchResultsUpdater | L'objet responsable de la mise à jour du contenu du contrôleur de résultats de recherche. |
UISearchController.isActive | L'état présenté de l'interface de recherche. |
UISearchController.obscuresBackgroundDuringPresentation | Un booléen indiquant si le contenu sous-jacent est masqué lors d'une recherche. |
UISearchController.dimsBackgroundDuringPresentation | Un booléen indiquant si le contenu sous-jacent est estompé lors d'une recherche. |
UISearchController.hidesNavigationBarDuringPresentation | Un booléen indiquant si la barre de navigation doit être masquée lors de la recherche. |
UIViewController.definesPresentationContext | Valeur booléenne indiquant si la vue de ce contrôleur de vue est couverte lorsque le contrôleur de vue ou l'un de ses descendants présente un contrôleur de vue. |
UIViewController.navigationItem.titleView | Une vue personnalisée affichée au centre de la barre de navigation lorsque le récepteur est le premier élément dans lequel une barre de recherche peut être placée. |
UITableViewController.tableView.tableHeaderView | Renvoie une vue d'accessoire affichée au-dessus de la table dans laquelle une barre de recherche peut être placée. |
Remarques
Barre de recherche dans le titre de la barre de navigation
Cet exemple utilise un contrôleur de recherche pour filtrer les données dans un contrôleur de vue de table. La barre de recherche est placée dans la barre de navigation dans laquelle la vue de table est incorporée.
Incorporer un UITableViewController
dans un UINavigationController
pour obtenir le UINavigationItem
(qui contient la barre de navigation). Ensuite, définissez notre classe ViewController personnalisée pour qu'elle hérite de UITableViewController
et adopte le protocole 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
}
}
Barre de recherche dans l'en-tête de vue de table
Cet exemple utilise un contrôleur de recherche pour filtrer les cellules dans un contrôleur de vue de table. La barre de recherche est placée dans la vue d'en-tête de la vue de table. Le contenu de la vue de table est décalé à la même hauteur que la barre de recherche, de sorte que la barre de recherche est masquée au début. Lors du défilement vers le haut du bord supérieur de la vue de la table, la barre de recherche est révélée. Ensuite, lorsque la barre de recherche devient active, elle masque la barre de navigation.
Incorporer un UITableViewController dans un UINavigationController pour obtenir le UINavigationItem (qui contient la barre de navigation). Ensuite, définissez notre classe ViewController personnalisée pour qu'elle hérite de UITableViewController et adopte le protocole 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
}
}
la mise en oeuvre
Tout d'abord, faites en sorte que votre classe soit conforme au protocole UISearchResultsUpdating
.
class MyTableViewController: UITableViewController, UISearchResultsUpdating {}
Ajoutez la propriété du contrôleur de recherche:
class MyTableViewController: UTableViewController, UISearchResultsUpdating {
let searchController = UISearchController(searchResultsController: nil)
}
Ajouter la barre de recherche:
override func viewDidLoad() {
super.viewDidLoad()
searchController.searchResultsUpdater = self
searchController.hidesNavigationBarDuringPresentation = false
searchController.dimsBackgroundDuringPresentation = false
searchController.searchBar.sizeToFit()
self.tableView.tableHeaderView = searchController.searchBar
}
Et enfin, implémentez la méthode updateSearchResultsForSearchController
qui provient du protocole UISearchResultsUpdating
:
func updateSearchResultsForSearchController(searchController: UISearchController) {
}
UISerachController dans 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.
}