Suche…


Syntax

  • UISearchController (searchResultsController: UIViewController?) // Geben Sie nil als Parameter an, wenn der Suchaktualisierungscontroller auch den durchsuchbaren Inhalt anzeigt.
  • func updateSearchResults (für searchController: UISearchController) // Erforderliche Methode zur Implementierung bei der Übernahme des UISearchResultsUpdating-Protokolls

Parameter

Parameter Einzelheiten
UISearchController.searchBar Die Suchleiste, die in Ihrer Benutzeroberfläche installiert werden soll. (schreibgeschützt)
UISearchController.searchResultsUpdater Das Objekt, das für die Aktualisierung des Inhalts des Suchergebniscontrollers verantwortlich ist.
UISearchController.isActive Der dargestellte Status der Suchoberfläche.
UISearchController.obscuresBackgroundDuringPresentation Ein boolescher Wert, der angibt, ob der zugrunde liegende Inhalt während einer Suche verdeckt wird.
UISearchController.dimsBackgroundDuringPresentation Ein boolescher Wert, der angibt, ob der zugrunde liegende Inhalt während einer Suche abgeblendet ist.
UISearchController.hidesNavigationBarDuringPresentation Ein boolescher Wert, der angibt, ob die Navigationsleiste bei der Suche ausgeblendet werden soll.
UIViewController.definesPresentationContext Ein boolescher Wert, der angibt, ob die Ansicht dieses View-Controllers abgedeckt ist, wenn der View-Controller oder einer seiner Nachkommen einen View-Controller darstellt.
UIViewController.navigationItem.titleView Eine benutzerdefinierte Ansicht, die in der Mitte der Navigationsleiste angezeigt wird, wenn der Empfänger das oberste Element ist, in dem eine Suchleiste platziert werden kann.
UITableViewController.tableView.tableHeaderView Gibt eine Zubehöransicht zurück, die über der Tabelle angezeigt wird, in der eine Suchleiste platziert werden kann.

Bemerkungen

UIKit Framework-Referenz:

UISearchController

UISearchErgebnisseAktualisierung

Suchleiste im Titel der Navigationsleiste

In diesem Beispiel wird ein Suchcontroller verwendet, um die Daten in einem Tabellensichtcontroller zu filtern. Die Suchleiste befindet sich in der Navigationsleiste, in die die Tabellenansicht eingebettet ist.

Suchleiste in der Navigationsleiste

Betten Sie einen UITableViewController in einen UINavigationController , um das UINavigationItem (das die Navigationsleiste enthält) zu erhalten. Stellen Sie dann unsere benutzerdefinierte ViewController-Klasse so ein, dass sie von UITableViewController erbt und das UISearchResultsUpdating Protokoll 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
    }
}

Suchleiste im Header der Tabellenansicht

In diesem Beispiel wird ein Suchcontroller verwendet, um die Zellen in einem Tabellensichtcontroller zu filtern. Die Suchleiste befindet sich in der Kopfansicht der Tabellenansicht. Der Inhalt der Tabellendarstellung ist um die gleiche Höhe wie die Suchleiste versetzt, sodass die Suchleiste zunächst ausgeblendet wird. Wenn Sie am oberen Rand der Tabellenansicht nach oben scrollen, wird die Suchleiste eingeblendet. Wenn dann die Suchleiste aktiv wird, blendet sie die Navigationsleiste aus.

search-bar-in-table-header-gif Suchleiste in der Tabelle

Betten Sie einen UITableViewController in einen UINavigationController ein, um das UINavigationItem (das die Navigationsleiste enthält) zu erhalten. Stellen Sie dann unsere benutzerdefinierte ViewController-Klasse so ein, dass sie von UITableViewController erbt, und übernehmen Sie das UISearchResultsUpdating-Protokoll.

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

Implementierung

UISearchResultsUpdating , dass Ihre Klasse dem Protokoll UISearchResultsUpdating .

class MyTableViewController: UITableViewController, UISearchResultsUpdating {}

Fügen Sie die Suchcontroller-Eigenschaft hinzu:

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

Fügen Sie die Suchleiste hinzu:

override func viewDidLoad() {
    super.viewDidLoad()

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

Implementieren updateSearchResultsForSearchController schließlich die updateSearchResultsForSearchController Methode, die aus dem UISearchResultsUpdating Protokoll stammt:

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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow