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
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
}
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.
}
}
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)
}
}
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.
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.
Versuche dies:
searchController.active = false
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)
}
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
}
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!