Wie gehen Sie mit dem Ereignis um, wenn Sie die Taste "x" drücken?
Ich probiere diese Methode aber funktioniert nicht.
-(void)searchBarCancelButtonClicked:(UISearchBar *)searchBar{
}
Ich glaube nicht, dass es eine einfache Möglichkeit gibt, sich in den X-Button einzuhaken.
Sie können sich jedoch in die direkte Konsequenz einklinken: gelöschter Text.
Versuche dies:
func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
if searchText == "" {
print("UISearchBar.text cleared!")
}
}
Der Nebeneffekt ist, dass dieser auch aufgerufen wird, wenn Sie Ihren Text manuell löschen.
Ein ziemlich hackiger Weg, aber das funktioniert.
private var didTapDeleteKey = false
func searchBar(_ searchBar: UISearchBar,
shouldChangeTextIn range: NSRange,
replacementText text: String) -> Bool
{
didTapDeleteKey = text.isEmpty
return true
}
func searchBar(_ searchBar: UISearchBar,
textDidChange searchText: String)
{
if !didTapDeleteKey && searchText.isEmpty {
// Do something here
}
didTapDeleteKey = false
}
Der Erfolg dieses Codes hängt davon ab, dass beim Tippen auf die Schaltfläche "Löschen" der Suchleiste searchBar(_:shouldChangeTextIn:replacementText:) -> Bool
nicht aufgerufen wird. Wenn Sie auf die Schaltfläche "Löschen" der Tastatur tippen, wird die Methode aufgerufen.
Ich hatte das gleiche Problem und habe versucht, das Problem mit dem Zugriff auf searchBars Unteransicht textField zu lösen, was jedoch zum Absturz meiner App führte. Mit letzter Anstrengung fand ich post .
Ein anderes Thema war, dass
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
wird zweimal aufgerufen, wenn der Abbrechen-Button angeklickt wird, siehe auch this .
Und schließlich habe ich getan;
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
if (![searchText isEqualToString:self.searchText]) {
self.searchText = searchText;
return;
}
NSLog(@"Clear clicked");
}
Das hat mein Problem gelöst.
Das funktioniert für mich
-(UITextField*)getUITexfieldInUISearchBar:(UIView*)aSearchBar{
UITextField *searchBarTextField;
for (UIView *subView in [aSearchBar subviews]){
if ([subView isKindOfClass:[UITextField class]])
{
searchBarTextField = (UITextField *)subView;
[searchBarTextField setDelegate:self];
break;
}else if ([subView isKindOfClass:[UIView class]]){
[self getUITexfieldInUISearchBar:subView];
}
}
return searchBarTextField;
}
Und Sie können den TextFields-Delegaten verwenden
- (BOOL)textFieldShouldClear:(UITextField *)textField {
//Do something here...
}
Sie können das angeklickte Ereignis "Cancel button" mit der UISearchBarDelegate-Methode verbinden und anschließend die Methode "searchBarCancelButtonClicked" implementieren
Einfachste Lösung in Swift 5.
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
if searchText.isEmpty {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
searchBar.resignFirstResponder()
}
}
}
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
if (searchText.length == 0) {
//clear button (x) on the search bar is cliecked, so clear the table
[self clearTable];
}
}
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String){
print("searchText: \(searchText)")
if searchText.count > 0
{
// Show ur content
}
else
{
// Hide your content
}
}
... funktioniert einfach
if(searchText.length==0||searchText==nil){
[self.searchBar resignFirstResponder];
[NSTimer scheduledTimerWithTimeInterval:0.1
target:self
selector:@selector(hideKeyboard)
userInfo:nil
repeats:NO];
}
- (void)hideKeyboard{
[self.searchBar resignFirstResponder];
}