Search code examples
iphoneuisearchbaruisearchbardelegate

UISearchBar and event fired when 'X' element is tapped


On the UISearchBar, there's an X element that allows you to clear all of the contents at once. Is there a way to get notified when this happens?

UISearchBarDelegate::searchBarCancelButtonClicked is fired only when the "Cancel" button is tapped.


Solution

  • The UISearchBar doesn't have a delegate method for this event. You can nearly get what you want by implementing the textDidChange: method of the callback delegate and checking for an empty string.

    I don't recommend it, but there is another possible way. The UISearchBar is composed of a UITextField, which does have a delegate method that is called when the user taps the clear button (textFieldShouldClear:). You can get the UITextField by traversing the UISearchBar's child views:

    (this is in the context of a derived UISearchBar class)

    - (UIView*) textField
    {
        for (UIView* v in self.subviews)
        {
            if ( [v isKindOfClass: [UITextField class]] )
                return v;
        }
    
        return nil;
    }
    

    from here, you could re-assign the UITextField delegate to your own implementation, taking care to forward delegate calls to the old delegate. This way you could intercept textFieldShouldClear:. Or if it turns out the UISearchBar is the delegate for the UITextField it contains you could swizzle the call to textFieldShouldClear:... Not ideal, clearly, but technically feasible.