iPhone perform action when UITextField / UISearchBar's clear button is pressed

Is it possible to gain access to a delegate method that will allow additional actions to be performed when the "clear" button is pressed on a UITextField / UISearchBar?

Thanks

Answers


See: UITextFieldDelegate Protocol Reference

If you set your view controller as the delegate for your text field (can be done in interface builder), you can use:

- (void)clearSearchTextField
{
  ...
}

- (BOOL)textFieldShouldClear:(UITextField *)textField
{
  if (textField == self.searchTextField) [self clearSearchTextField];
  return YES;
}

For Swift 3:

To perform an action when the "clear" button is pressed on a UITextField

func textFieldShouldClear(_ textField: UITextField) -> Bool {
    if textField == yourTextFieldName {
        // do some action
    }
    return true
}

For a UISearchBar you will want to implement func searchBar(searchBar: UISearchBar, textDidChange searchText: String).

This is triggered before func searchBarTextDidBeginEditing(searchBar: UISearchBar) and before func searchBar(searchBar: UISearchBar, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool as well.

You implementation should look something like this:

func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
        if searchText == "" {
            //Code to execute when search is cleared
        }
    }

When you clear the text field several events will happen that you will have access to through either the UISearchDisplayDelegate or the UISearchBarDelegate such as searchBar:textDidChange and searchDisplayController:shouldReloadTableForSearchString

This will also cause the search table to hide so it will trigger

searchDisplayController:willHideSearchResultsTableView  
searchDisplayController:didHideSearchResultsTableView

When the search table will hide you can check if the search text is empty and then do whatever you need to do.


See my answer here: https://stackoverflow.com/a/3852509/91458 – it’s for a searchBar but should apply to a textField as well.


Need Your Help

How do I make a Jenkins job start after multiple simultaneous upstream jobs succeed?

plugins build continuous-integration jenkins pipeline

In order to get the fastest feedback possible, we occasionally want Jenkins jobs to run in Parallel. Jenkins has the ability to start multiple downstream jobs (or 'fork' the pipeline) when a job fi...

Hangfire recurring tasks under minute

c# .net hangfire

Is there a way to set hangfire recurring jobs every few seconds?