I'm using the UISearchBar (but not the SearchDisplayController that's typically used in conjunction) and I'd like to dismiss the keyboard when you hit the 'X' button.
I've followed TomSwift's suggestion on getting called when the 'X' is tapped and that works great. But resigning first responder from the text field and also invoking in the UISearchBar instance, both with resignFirstResponder
, won't make the keyboard go away.
Is there a way to get rid of the keyboard when the user has tapped the X button?
Here's what I did to get the 'Clear' notify:
- (void)viewDidLoad:
{
for (UIView* v in searchBar.subviews)
{
if ( [v isKindOfClass: [UITextField class]] )
{
UITextField *tf = (UITextField *)v;
tf.delegate = self;
break;
}
}
}
Then I have my class setup to implement both UISearchBarDelegate and UITextFieldDelegate.
Having the class serve as the textfield delegate allows me to get this call:
- (BOOL)textFieldShouldClear:(UITextField *)textField
{
[textField resignFirstResponder];
[self.searchBar resignFirstResponder];
return YES;
}
I've tried everything I can think of. The last thing I'm trying is to find a way to issue the 'searchBarCancelButtonClicked' that UISearchDelegate will invoke on my Controller class but not I'm sure how I could do this since the UISearchBar doesn't seem to have any direct methods to invoke with this name.
This works:
I found this in a previous question:
UISearchbar clearButton forces the keyboard to appear
It should do exactly what you want to do.
Update:
Well, this is a total hack but I was able to make it work. Basically the code invokes the handler for the cancel button. To make it work I had to invoke the selector with a delay, and I'm not sure why this had to be. Also, I had to write an accessor for the cancel button just like you did for the text field.
Again, this is a total hack. I'm not sure I'd do this myself in an app.
Original answer:
How do you get the clear 'X' button to display in the first place? In my test case I dont see it displaying...
Try doing a resignFirstResponder on the searchBar, not the textField.
Shouldn't UI changes be made on the main thread instead of using
performselector:WithObject:afterDelay:
?Try to avoid
method in your code we can solve this
EDIT: Actually, the below breaks the delegate that is connected to UISearchBar. Just subclass UISearchBar and overwrite the UITextField Delegate method.
===========================
I had to do this to get access to the UITextView