点击'X'元素时触发UISearchBar和事件

时间:2010-11-08 01:07:23

标签: iphone uisearchbar uisearchbardelegate

在UISearchBar上,有一个X元素,允许您一次清除所有内容。有没有办法在发生这种情况时收到通知?

UISearchBarDelegate::searchBarCancelButtonClicked仅在点击“取消”按钮时被触发。

4 个答案:

答案 0 :(得分:7)

UISearchBar没有此事件的委托方法。通过实现回调委托的textDidChange:方法并检查空字符串,您几乎可以获得所需的内容。

我不推荐它,但还有另一种可能的方法。 UISearchBar由UITextField组成,它具有一个委托方法,当用户点击清除按钮(textFieldShouldClear:)时会调用该方法。您可以通过遍历UITextField的子视图来获取UISearchBar

(这是在派生的UISearchBar类的上下文中)

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

    return nil;
}

从这里,您可以UITextField委托重新分配给您自己的实现,注意将委托调用转发给旧委托。这样你就可以拦截textFieldShouldClear:。或者如果事实证明UISearchBar是它所包含的UITextField的委托,你可以调用textFieldShouldClear:......不理想,但技术上可行。

答案 1 :(得分:2)

我遇到了同样的问题,我使用此功能解决了这个问题。

- (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];
       }];
    }
}

答案 2 :(得分:1)

以上是上一个问题的答案,这应该完全符合您的要求。 UISearchbar clearButton forces the keyboard to appear

答案 3 :(得分:0)

这是“Method Swizzling”解决方案。

  1. 创建UISearchBar的新类别。此类别在运行时在-(BOOL)textFieldShouldClear:(UITextField *)textField;-(BOOL)jbm_textFieldShouldClear:(UITextField *)textField之间创建一个新方法和混合方法。
  2. 自定义UISearchBarDelegate的新协议,以便添加新方法- (void)searchBarClearButtonClicked:(id)sender;
  3. 的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
    

    参考

    1. Dave DeLong - How to add a method to an existing protocol in Cocoa?

    2. Nikolay Vlasov - CCBottomRefreshControl