webentwicklung-frage-antwort-db.com.de

Wie beenden Sie die Suche durch Klicken auf die Schaltfläche "Abbrechen"?

Ich habe eine Suchleiste mit der Schaltfläche "Abbrechen". Wenn ich jedoch auf die Schaltfläche Abbrechen klicke, wird die Suchleiste nicht geschlossen. Wie kann ich das machen, wenn Sie auf Abbrechen klicken, wird die Suchleiste wieder in den ersten Status versetzt.

Wenn Sie Fragen haben, fragen Sie mich bitte

17
John Doe

Sie müssen UISearchBarDelegate implementieren:

class ViewController: UIViewController, UISearchBarDelegate {
    @IBOutlet weak var searchBar: UISearchBar!

Setzen Sie den Delegierten der Suchleiste auf "selbst"

 override func viewDidLoad() {
        super.viewDidLoad()

        searchBar.showsCancelButton = true
        searchBar.delegate = self

implementieren Sie anschließend die Delegierungsfunktion butCancelSearchAction, um alle erforderlichen Aktionen auszuführen, um die Suchaktion abzubrechen und den Suchtext zurückzusetzen:

func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
    // Do some search stuff
}

func searchBarCancelButtonClicked(searchBar: UISearchBar) {
    // Stop doing the search stuff
    // and clear the text in the search bar
    searchBar.text = ""
    // Hide the cancel button
    searchBar.showsCancelButton = false
    // You could also change the position, frame etc of the searchBar 
}
41
greentor
class MyController: UIViewController, UISearchBarDelegate {
    // Called when search bar obtains focus.  I.e., user taps 
    // on the search bar to enter text.
    func searchBarTextDidBeginEditing(searchBar: UISearchBar) {
        searchBar.showsCancelButton = true
    }

    func searchBarCancelButtonClicked(searchBar: UISearchBar) {
        searchBar.text = nil
        searchBar.showsCancelButton = false

        // Remove focus from the search bar.
        searchBar.endEditing(true)

        // Perform any necessary work.  E.g., repopulating a table view
        // if the search bar performs filtering. 
    }
}
9
orangemako

Versuchen. Es funktioniert gut.

class MyViewController: UIViewController, UISearchBarDelegate {

    func searchBarTextDidBeginEditing(_searchBar: UISearchBar) {
        searchBar.setShowsCancelButton(true, animated: true)
        //write other necessary statements
    }

    func searchBarCancelButtonClicked(_searchBar: UISearchBar) {
        searchBar.text = nil
        searchBar.setShowsCancelButton(false, animated: true)

        // Remove focus from the search bar.
        searchBar.endEditing(true) 
    }
} 
5
mumu

Sehr schnell und einfach. Passen Sie einfach das UISearchBarDelegate-Protokoll an und implementieren Sie dann diese Funktion in Ihrer Klasse:

func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
    searchBar.resignFirstResponder()
}

resign bedeutet, dass es beendet wird

FirstResponder ist der Fokus der Ansicht

Abschließend wird der Fokus von der Suchleiste genommen und effektiv abgebrochen.

2
George_E

Ich bin auch auf dieses Problem gestoßen, in meinem Fall nach dem Durchsuchen eines Elements aus der Tabellensicht als einem Klick auf das Ergebniselement, dessen Detailansicht geöffnet ist. Die Suchleiste verschwindet jedoch nicht. Ich benutze Nicats Antwort mit ein paar Änderungen, hier ist meine Version:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    searchController.isActive = false
    self.searchBarCancelButtonClicked(searchController.searchBar)

    ...
}

Swift 3

func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool {
    searchBar.showsCancelButton = true
    return true
}

func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
    self.searchBar.endEditing(true)
    searchBar.resignFirstResponder()
}

func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
    searchBar.resignFirstResponder()
}

func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
    self.searchBar.endEditing(true)
    searchBar.showsCancelButton = false
    searchBar.resignFirstResponder()
}

The Cancel button appears only when the user start entering characters in the field.
2
Manu

Versuche dies:

searchController.active = false
2
Nicat Rzayev

Sie müssen das UISearchBarDelegate implementieren. 

Das UISearchBarDelegate-Protokoll definiert die optionalen Methoden, die Sie implementieren, um ein UISearchBar-Steuerelement funktional zu machen. Ein UISearchBar-Objekt stellt die Benutzeroberfläche für ein Suchfeld in einer Leiste bereit. Die Anwendung ist jedoch für die Implementierung der Aktionen verantwortlich, wenn auf die Schaltflächen geklickt wird. Die delegate muss mindestens die eigentliche Suche durchführen, wenn Text in die textField eingegeben wird. Lesen Sie dies

In Ziel C

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar {

     [self.searchDisplayController setActive:NO animated:YES];

}

In Swift:

func searchBarCancelButtonClicked(searchBar: UISearchBar) {

    self.searchDisplayController.setActive(false, animated: true)
}
1
Mayank Patel

Für die Objective-C-Lösung

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar {

    if(@available(iOS 11.0, *)){
        [self.navigationController.navigationItem.searchController.searchBar resignFirstResponder];
    }
    // reload your table or whatever you want.
    // searchController is available after the iOS 11, so it will be good to use @available check
}
0
elia

Wenn Sie auf die Schaltfläche "Abbrechen" tippen, wird searchBar angezeigt, als hätten Sie etwas Neues gesucht. Wenn Sie also resignFirstResponder() auf cancelButton klicken, funktioniert es nicht, da es didBeginText aufruft.

Also habe ich eine Bedingung in didBeginText gesetzt, also wenn der String in der Suche weniger oder 0 Zeichen enthält, wird er den ersten Responder zurückweisen. Genau wie dieser: 

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    if searchText.characters.count < 1 {
        searchBar.resignFirstResponder()
    }
}

Es ist ein einfacher Ansatz und funktioniert auch. Freundliche Grüße!

0
Hackbarth