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.
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.
I had the same issue and I solved this issue by using this function.
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 
{
    // This method has been called when u enter some text on search or Cancel the search.
    if([searchText isEqualToString:@""] || searchText==nil) {
        // Nothing to search, empty result.
       [UIView animateWithDuration:0.2 animations:^ {
        //Reposition search bar 
        [_searchBar setFrame:CGRectMake(230, 26, 43, 44)];
        [_searchBar setNeedsLayout];
       }];
    }
}
Here is an answer from a previous question, this should do exactly what you want. UISearchbar clearButton forces the keyboard to appear
Here is "Method Swizzling" solution.
- Create a new Category of UISearchBar. This category create a new method and swizzle method between-(BOOL)textFieldShouldClear:(UITextField *)textField;and-(BOOL)jbm_textFieldShouldClear:(UITextField *)textFieldin runtime.
- Customize a new Protocol of UISearchBarDelegatein order to add a new method- (void)searchBarClearButtonClicked:(id)sender;
UISearchBar+JMBTextFieldControl.h
    @protocol UISearchBarWithClearButtonDelegate <UISearchBarDelegate>
    @optional
    - (void)searchBarClearButtonClicked:(id)sender;
    @end
    @interface UISearchBar (JMBTextFieldControl)
    @end
UISearchBar+JMBTextFieldControl.m
    #import "UISearchBar+JMBTextFieldControl.h"
    #import <objc/runtime.h>
    @implementation NSObject (Swizzling)
    + (void)brc_swizzleMethod:(SEL)origSelector withMethod:(SEL)newSelector
    {
        Method origMethod = class_getInstanceMethod(self, origSelector);
        Method newMethod = class_getInstanceMethod(self, newSelector);
        if(class_addMethod(self, origSelector, method_getImplementation(newMethod), method_getTypeEncoding(newMethod)))
            class_replaceMethod(self, newSelector, method_getImplementation(origMethod), method_getTypeEncoding(origMethod));
        else
            method_exchangeImplementations(origMethod, newMethod);
    }
    @end
    @implementation UISearchBar (JMBTextFieldControl)
    + (void)load {
        [self brc_swizzleMethod:@selector(textFieldShouldClear:) withMethod:@selector(jbm_textFieldShouldClear:)];
    }
    - (id<UISearchBarWithClearButtonDelegate>)jbm_customDelegate {
        if( [[self delegate] conformsToProtocol:@protocol(UISearchBarWithClearButtonDelegate)] )
            return (id<UISearchBarWithClearButtonDelegate>)[self delegate];
        else
            return nil;
    }
    - (BOOL)jbm_textFieldShouldClear:(UITextField *)textField
    {
        if ( [[self jbm_customDelegate] respondsToSelector:@selector(searchBarClearButtonClicked:)] )
            [[self jbm_customDelegate] searchBarClearButtonClicked:self];
        return [self jbm_textFieldShouldClear:textField];
    }
    @end
Reference
- Dave DeLong - How to add a method to an existing protocol in Cocoa? 
- Nikolay Vlasov - CCBottomRefreshControl 
 
         加载中,请稍侯......
 加载中,请稍侯......
      
精彩评论