2016-01-09 5 views
10

Ich habe eine Suchleiste mit Abbrechen-Taste. Aber wenn ich auf "Abbrechen" klicke, wird die Suchleiste nicht geschlossen. Wie kann ich das machen, wenn ich auf "Abbrechen" klicke, wird die Suchleiste auf den ersten Zustand zurückgesetzt?Wie kann man beim Klicken auf Abbrechen die Suche beenden?

Wenn Sie Fragen haben - fragen Sie mich, bitte

Antwort

23

Sie müssen die UISearchBarDelegate implementieren:

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

die Suche einstellen Bar Delegaten selbst

override func viewDidLoad() { 
     super.viewDidLoad() 

     searchBar.showsCancelButton = true 
     searchBar.delegate = self 

und dann die Funktion butCancelSearchAction Delegierten implementieren zu tun, was Sie die Suchaktion abzubrechen und setzen Sie den Suchtext tun müssen:

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

Nein, ich habe das nicht gefragt. Klicken Sie auf Abbrechen Ich möchte meine Suche schließen. Zum Beispiel habe ich eine Suchleiste. Wenn ich darauf klicke, erscheint die Abbrechen-Schaltfläche und die Größe von Bar ändert sich. Recht? Also, bei Abbrechen möchte ich es auf das ursprüngliche Aussehen zurückgeben –

+0

In searchBarCancelButtonClicked können Sie implementieren, was auch immer Sie tun müssen, wenn Abbruch angeklopft wird, die Suchleiste in den Ausgangszustand zurückgesetzt. Ich habe meine Antwort etwas aktualisiert, um dies zu zeigen. – greentor

+0

Um die Abbrechen-Schaltfläche auszublenden, verwenden Sie searchBar.showsCancelButton = false in searchBarCancelButtonClicked. – greentor

1

Sie müssen die UISearchBarDelegate implementieren.

Das Protokoll UISearchBarDelegate definiert die optionalen Methoden, die Sie implementieren, um eine UISearchBar-Steuerung funktionsfähig zu machen. Ein UISearchBar Objekt stellt die Benutzeroberfläche für ein Suchfeld in einer Leiste bereit, es liegt jedoch in der Verantwortung der Anwendung, die Aktionen beim Antippen von Schaltflächen zu implementieren. Zumindest muss die delegate die tatsächliche Suche ausführen, wenn Text in textField eingegeben wird. Read this

In Objective C

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

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

} 

In Swift:

func searchBarCancelButtonClicked(searchBar: UISearchBar) { 

    self.searchDisplayController.setActive(false, animated: true) 
} 
+0

gibt es nicht 'setActive' in UISearchBar in Swift =/ –

+0

leider ist es nicht, was ich will. Es hat nichts gemacht. Klicken Sie auf Abbrechen Ich möchte meine Suche schließen. Zum Beispiel habe ich eine Suchleiste. Wenn ich darauf klicke, erscheint die Abbrechen-Schaltfläche und die Größe von Bar ändert sich. Recht? Also, auf Abbrechen möchte ich es auf den ursprünglichen Look –

+0

können Sie Screenshot hochladen oder zeigen Sie Ihren Code? Was hast du UISearchControllor os UISearchbar benutzt? –

5
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. 
    } 
} 
+1

es funktioniert, danke. Aber nachdem die Schaltfläche "Abbrechen" angeklickt wurde, wird die Filterung nicht entfernt, sodass der Benutzer keine anderen Tabelleneinträge mehr sehen kann. Das erneute Laden der Tabelle mit self.Table.reloadData() kann helfen – mostworld77

0

Wenn Sie das tippen Cancel-Taste, die searchBar sieht es wie Sie haben eine neue Sache zu suchen, deshalb, wenn Sie setzen resignFirstResponder() auf die cancelButton geklickt wird es nicht funktionieren, denn danach wird es didBeginText aufrufen.

Also habe ich eine Bedingung in didBeginText, also, wenn die Zeichenfolge in der Suche weniger oder 0 Zeichen hat, wird es die erste Antwort zurücktreten. Einfach so:

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

Es ist ein einfacher Ansatz und funktioniert auch. Mit freundlichen Grüßen!

5

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) 
    } 
} 
+0

Kaum von orangemakos Antwort geändert, sollte also nur ein Kommentar sein. Beachten Sie, dass "searchBar: UISearchBar" jetzt in beiden Fällen zu "_ searchBar: UISearchBar" geworden ist. –

+0

Okay. Ich werde aktualisieren. Vielen Dank. – mumu

0

Try this:

searchController.active = false 
+1

Fügen Sie bitte eine Erklärung zu Ihrem Beitrag hinzu und geben Sie an, was Sie für falsch halten und warum Ihr Vorschlag das Problem lösen wird. – LordWilmore

0

Ich bin auch mit diesem Problem in meinem Fall stoßen, nachdem ein beliebiges Element aus Tabellensicht der Suche als einer der Position Ergebnis klicken es geöffnet Details anzeigen, aber Suchleiste ist nicht verschwunden.Ich benutze Nicat's answer mit wenig Änderungen, hier ist meine Version:

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

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

    ... 
} 
1

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. 
+0

'func searchBarTextDidEndEditing (_ SearchBar: UISearchBar) { self.searchBar.endEditing (true) searchBar.resignFirstResponder() } ' Sieht aus wie es eine Endlosschleife schaffen – jocken

Verwandte Themen