I have a UISearchBar and on the delegate method I hide the keyboard when the text field is cleared:
- (void)searchBar:(UISearchBar *)filterBar textDidChange:(NSString *)filterText { NSLog(@'filter: %@', filterText); if ([filterText length] == 0) { NSLog(@'hiding keyboard'); [filterBar resignFirstResponder ];
Now when I use the backspace button to clear out the search term all is good. The keyboard hides when the search turns to empty. Not so when I am pressing the ‘cross’ button to clear out the search field altogether.
Well, not entirely true. I does call resignFirstResponder and hides the keyboard – you just can’t see it because it comes right back up. I found this out by observing the keyboard show/hide events.
So how come the keyboard is shown again? How can I prevent this?
I’ve already tried to walk all subviews of the UISearchBar and also call resignFirstResponder on those …but unless I did something wrong – that doesn’t solve this either.
Update:
In fact I just got the keyboard to not disable the ‘Done’ button 😀 …so I will ‘stop’ going down that road as Kevin suggested. Still I would like to know why the keyboard came back up like this.
I basically agree with Kevin, but that doesn’t help you so here goes:
Try looping through the subviews of the searchbar and find the sibling which is of the class UITextField. Then either set the delegate property of this text field to your ViewController’s class and handle the callback there (e.g. textViewShouldReturn), or simply call resignFirstResponder directly on the text field. The former obviously needs to be done at init/load time while the latter can be done in your existing textDidChange callback.
Here are some more pointers:
http://discussions.apple.com/thread.jspa?threadID=1479468&tstart=0 http://discussions.apple.com/thread.jspa?messageID=8176608