Just resign the first responder but in the next run loop like this:
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
if ([searchText length] == 0)
{
[searchBar performSelector:@selector(resignFirstResponder)
withObject:nil
afterDelay:0];
}
}
Tested and it works.