Поиск…


Синтаксис

  • UISearchController (searchResultsController: UIViewController?) // Передача nil в качестве параметра, если контроллер обновления поиска также отображает содержимое, доступное для поиска.
  • func updateSearchResults (для searchController: UISearchController) // Необходимый метод для реализации при использовании протокола UISearchResultsUpdating

параметры

параметр подробности
UISearchController.searchBar Панель поиска для установки в вашем интерфейсе. (только для чтения)
UISearchController.searchResultsUpdater Объект, ответственный за обновление содержимого контроллера результатов поиска.
UISearchController.isActive Представленное состояние интерфейса поиска.
UISearchController.obscuresBackgroundDuringPresentation Логическое значение, указывающее, скрывается ли основное содержимое во время поиска.
UISearchController.dimsBackgroundDuringPresentation Логическое значение, указывающее, является ли основной контент затухающим во время поиска.
UISearchController.hidesNavigationBarDuringPresentation Логическое значение указывает, следует ли скрывать навигационную панель при поиске.
UIViewController.definesPresentationContext Логическое значение, указывающее, рассматривается ли это представление диспетчера вида, когда контроллер вида или один из его потомков представляет контроллер вида.
UIViewController.navigationItem.titleView Пользовательский вид отображается в центре панели навигации, когда приемник является верхним элементом, в котором может быть помещена панель поиска.
UITableViewController.tableView.tableHeaderView Возвращает вспомогательный вид, который отображается над таблицей, в которой может быть помещена панель поиска.

замечания

Ссылка на UIKit Framework:

UISearchController

UISearchResultsUpdating

Панель поиска в заголовке панели навигации

В этом примере используется контроллер поиска для фильтрации данных внутри контроллера табличного представления. Строка поиска помещается в панель навигации, в которую встроена таблица.

поиск-бар-в-нав-бар

Вставьте UITableViewController в UINavigationController чтобы получить UINavigationItem (который содержит панель навигации). Затем установите наш пользовательский класс ViewController для наследования из UITableViewController и UISearchResultsUpdating протокол 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
    }
}

Панель поиска в заголовке таблицы

В этом примере используется контроллер поиска для фильтрации ячеек в контроллере табличного представления. Строка поиска помещается внутри заголовка представления таблицы. Содержимое табличного представления смещается с той же высотой, что и панель поиска, так что панель поиска сначала скрыта. При прокрутке вверх по верхнему краю представления таблицы открывается панель поиска. Затем, когда панель поиска становится активной, она скрывает панель навигации.

поиск-бар-в-табличного-заголовок-GIF поиск-бар-в-табличного-заголовок

Вставьте UITableViewController в UINavigationController, чтобы получить UINavigationItem (который содержит панель навигации). Затем установите наш пользовательский класс ViewController для наследования из UITableViewController и примените протокол 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
    }
}

Реализация

Во-первых, сделайте свой класс совместимым с UISearchResultsUpdating .

class MyTableViewController: UITableViewController, UISearchResultsUpdating {}

Добавьте свойство контроллера поиска:

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

Добавьте панель поиска:

override func viewDidLoad() {
    super.viewDidLoad()

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

И, наконец, updateSearchResultsForSearchController метод updateSearchResultsForSearchController который поступает из протокола UISearchResultsUpdating :

func updateSearchResultsForSearchController(searchController: UISearchController) {

}

UISerachController в 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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow