Удалите кнопку очистки (серый х) справа от UISearchBar при нажатии кнопки отмены - PullRequest
23 голосов
/ 16 июня 2010

Хорошо, для начала мой вопрос, вот несколько скриншотов проблемы, уже решенной приложением Spotify:

Шаг 1 Spotify: Стандартный UISearchBar не в режиме редактирования.

Шаг 1 http://i49.tinypic.com/wbtpwi.png

Шаг 2 Spotify: UISearchBar теперь в режиме редактирования. Введено условие поиска. Кнопка Cancel скользит справа, и появляется кнопка очистки (серый x).

Шаг 2 http://i45.tinypic.com/161kbvp.png

Шаг 3 Spotify: Нажата кнопка отмены; клавиатура выдвигается, и панель поиска больше не находится в режиме редактирования. Поисковый термин остается, и серая кнопка теперь скрыта .

Шаг 3 http://i46.tinypic.com/20utv9v.png

В настоящее время при нажатии кнопки my отмены запускается следующий код:

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar {
    [searchBar resignFirstResponder];
    [searchBar setShowsCancelButton:NO animated:YES];
}

Что приводит к:

Мой шаг 3: Панель поиска теперь не в режиме редактирования. Кнопка отмены и клавиатура выдвинулись. Поисковый термин остается, но серый цвет также сохраняется.

Задача http://i46.tinypic.com/rlm4w5.png

Итак, мой вопрос таков: учитывая, что -resignFirstResponder-endEditing:, FYI) не скрывает серую кнопку x, когда в строку поиска введен текст, как это сделать скрыть это?

Еще раз спасибо, друзья.

Ответы [ 11 ]

29 голосов
/ 16 июня 2010

Проблема в том, что UISearchBar не предоставляет свое текстовое поле, а управляет свойствами самого текстового поля. Иногда значения свойств не то, что вы хотите.

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

Мое решение состояло в том, чтобы пройтись по подпредставлениям панели поиска, пока не найдете текстовое поле. После этого вы сможете установить свойство clearButtonMode, используя в качестве параметра что-то вроде UITextFieldViewModeWhileEditing.

Это должно сделать так, чтобы кнопка очистки отображалась только во время редактирования текстового поля.

Вы хотите сделать это на viewDidLoad или чем-то раннем, поэтому он устанавливается до того, как вы начнете его использовать (но после инициализации панели поиска.

for (UIView *subview in searchBar.subviews)
{
    if ([subview conformsToProtocol:@protocol(UITextInputTraits)])
    {
        [(UITextField *)subview setClearButtonMode:UITextFieldViewModeWhileEditing];
    }
}
6 голосов
/ 11 марта 2014

Я строю на предыдущих ответах, потому что я начал видеть сбои на iOS 7.1, если я не сделал следующее изменение. Я добавил дополнительный вызов к respondsToSelector для каждого просмотра, чтобы убедиться, что setClearButtonMode: может быть вызван. Я наблюдал случай прохождения UISearchBar, который, кажется, соответствует протоколу UITextInputTraits, но не имеет селектора setClearButtonMode:, поэтому произошел сбой. Экземпляр UISearchBarTextField также передается и является фактическим объектом для вызова setClearButtonMode:.

- (void)removeClearButtonFromView:(UIView *)view
{
    if (!view)
    {
        return;
    }

    for (UIView *subview in view.subviews)
    {
        [self removeClearButtonFromView:subview];
    }

    if ([view conformsToProtocol:@protocol(UITextInputTraits)])
    {
        UITextField *textView = (UITextField *)view;
        if ([textView respondsToSelector:@selector(setClearButtonMode:)])
        {
            [textView setClearButtonMode:UITextFieldViewModeNever];
        }
    }
}
6 голосов
/ 19 октября 2013

Похоже, iOS 7 изменил иерархию представления UISearchBar, и текстовое поле более глубокое в представлении (вышеупомянутое решение не сработало для меня). Однако изменение вышеуказанного решения для обхода всей иерархии работает:

[self configureSearchBarView:[self searchBar]];

- (void)configureSearchBarView:(UIView*)view {
    for (UIView *subview in [view subviews]){
        [self configureSearchBarView:subview];
    }
    if ([view conformsToProtocol:@protocol(UITextInputTraits)]) {
        [(UITextField *)view setClearButtonMode:UITextFieldViewModeWhileEditing];
    }
}
4 голосов
/ 26 ноября 2014

Вам нужно получить текстовое поле панели поиска

UITextField *textField = [searchBar valueForKey:@"_searchField"];
textField.clearButtonMode = UITextFieldViewModeNever;

использовать в - (void) searchBarTextDidBeginEditing: (UISearchBar *) метод searchBar.

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
 {

UITextField *textField = [searchBar valueForKey:@"_searchField"];
textField.clearButtonMode = UITextFieldViewModeNever;


 }
4 голосов
/ 27 июня 2014

Лучший способ сделать это в iOS7:

[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setClearButtonMode:UITextFieldViewModeWhileEditing];

3 голосов
/ 17 января 2013

Чтобы развернуть ответ Jadariens, если вы никогда не хотите, чтобы серый x появлялся, вам нужно использовать следующее

for (UIView *subview in searchBar.subviews)
{
    if ([subview conformsToProtocol:@protocol(UITextInputTraits)])
    {
        [(UITextField *)subview setClearButtonMode:UITextFieldViewModeNever];
    }
}
1 голос
/ 08 февраля 2016

Принятый ответ не работает на iOS7 +, здесь измененная версия как расширение Swift

extension UIView {
    class func removeClearButton(svs: [UIView]) {
        for sv in svs {
            if let tv = sv as? UITextField where sv.conformsToProtocol(UITextInputTraits) {
                tv.clearButtonMode = .Never
                return
            } else {
                UIView.removeClearButton(sv.subviews)
            }
        }
    }
}

Использование

UIView.removeClearButton(searchBar.subviews)
0 голосов
/ 29 сентября 2015
for (UIView *subview in _search_bar.subviews)
{
    NSLog(@"%@",subview.subviews);

    for (UIView *subview11 in subview.subviews)
    {
        if ([subview11 conformsToProtocol:@protocol(UITextInputTraits)])
        {
            [(UITextField *)subview11 setClearButtonMode:UITextFieldViewModeNever];
        }
    }

}
0 голосов
/ 17 июня 2015

Для значка (x) в панели поиска.Вы можете использовать ниже метод делегата.

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
{
    searchBar.showsCancelButton = YES;
}
0 голосов
/ 15 апреля 2015

Здесь есть лучший способ, чем любой из ответов, и вам не нужно использовать частные API или обходить подвиды, чтобы сделать это.

UISearchBar имеет встроенный API для этого:

[UISearchBar setImage: forSearchBarIcon: состояние]

Клавиша пиктограммы SearchBar, которую вы хотите, - UISearchBarIconClear, и вы хотите состояние UIControlStateNormal Затем дайте ему четкое изображение для изображения, и все готово.

Итак, это должно выглядеть так:

[searchBar setImage:clearImage forSearchBarIcon:UISearchBarIconClear state:UIControlStateNormal];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...