UISearchBar и событие вызывается при нажатии элемента 'X' - PullRequest
9 голосов
/ 08 ноября 2010

На UISearchBar есть элемент X, который позволяет вам очистить все содержимое одновременно.Есть ли способ получать уведомления, когда это происходит?

UISearchBarDelegate::searchBarCancelButtonClicked срабатывает только при нажатии кнопки «Отмена».

Ответы [ 4 ]

7 голосов
/ 08 ноября 2010

У 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: ... Не идеально, ясно, но технически выполнимо.

2 голосов
/ 21 мая 2014

У меня была такая же проблема, и я решил эту проблему с помощью этой функции.

- (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];
       }];
    }
}
1 голос
/ 16 ноября 2010

Вот ответ на предыдущий вопрос, это должно делать именно то, что вы хотите. UISearchbar clearButton заставляет клавиатуру появиться

0 голосов
/ 08 января 2016

Вот решение «Метод Swizzling».

  1. Создайте новую категорию UISearchBar.Эта категория создает новый метод и метод swizzle между -(BOOL)textFieldShouldClear:(UITextField *)textField; и -(BOOL)jbm_textFieldShouldClear:(UITextField *)textField во время выполнения.
  2. Настройте новый протокол UISearchBarDelegate, чтобы добавить новый метод - (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

Ссылка

  1. Дейв Делонг - Как добавить метод в существующий протокол в Какао?

  2. Николай Власов - CCBottomRefreshControl

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...