Подтвердить что ты не робот

Можно ли подключить UISearchBar Clear Button?

У меня есть UISearchBar в моем интерфейсе, и я хочу настроить поведение маленькой кнопки очистки, которая появляется в строке поиска после ввода некоторого текста (это маленький серый круг с крестом в нем, появляется в правой части поля поиска).

В принципе, я хочу, чтобы он не только очищал текст строки поиска (которая является реализацией по умолчанию), но и очищает некоторые другие вещи от моего интерфейса, но вызывает один из моих собственных методов.

Я не могу найти что-либо в документах для класса UISearchBar или протокола UISearchBarDelegate - это не похоже на то, что вы можете напрямую получить доступ к этому поведению.

Единственное, что я заметил, это то, что документы объяснили, что метод делегата:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText;

вызывается после нажатия кнопки очистки.

Я изначально написал код в этом методе, который проверял свойство текста строки поиска, и если он был пуст, тогда он был очищен и выполнил все мои другие вещи.

Две проблемы, которые это хотя:

Во-первых, по какой-то причине я не могу понять, хотя я говорю в строке поиска resignFirstResponder в конце моего метода, что-то, где-то вернул его, чтобы стать FirstResponder. Действительно раздражает...

Во-вторых, если пользователь не использует кнопку очистки и просто удаляет текст на панели с помощью кнопки удаления на клавиатуре, этот метод запускается, и результаты их поиска исчезают. Нехорошо.

Любые советы или указатели в правильном направлении были бы замечательными!

Спасибо!

4b9b3361

Ответ 2

Нашел лучшее решение для этой проблемы:)

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{
    if ([searchText length] == 0) {
        [self performSelector:@selector(hideKeyboardWithSearchBar:) withObject:searchBar afterDelay:0];
    }
}

- (void)hideKeyboardWithSearchBar:(UISearchBar *)searchBar{   
    [searchBar resignFirstResponder];   
}

Ответ 3

У меня есть этот код в моем приложении. Разница в том, что я не поддерживаю "живой поиск", но вместо этого начинаю поиск, когда пользователь прикасается к кнопке поиска на клавиатуре:

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar {
    if ([searchBar.text isEqualToString:@""]) {
        //Clear stuff here
    }
}

Ответ 4

Быстрая обработка версии закрывает клавиатуру на кнопке "Очистить":

func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
    if searchText.characters.count == 0 {
        performSelector("hideKeyboardWithSearchBar:", withObject:searchBar, afterDelay:0)
    }
}

func hideKeyboardWithSearchBar(bar:UISearchBar) {
    bar.resignFirstResponder()
}

Ответ 5

Я бы предложил использовать методы rightView и rightViewMode UITextField, чтобы создать собственную кнопку очистки, которая использует одно и то же изображение. Я предполагаю, конечно, что UISearchBar позволит вам получить доступ к UITextField внутри него. Думаю, это будет. Помните об этом в справочной библиотеке iPhone OS:

If an overlay view overlaps the clear button, however, the clear button always takes precedence in receiving events. By default, the right overlay view does overlap the clear button.

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

Ответ 6

Так как это первое, и насколько я вижу, вопрос не был адекватно рассмотрен, я думал, что опубликую свое решение.

1) Вам нужно получить ссылку на textField внутри searchBar 2) Вам нужно поймать, что textField очищается, когда он срабатывает.

Это довольно просто. Вот один из способов.

a) Убедитесь, что вы создали свой класс a, так как вы будете использовать метод делегата textField внутри searchBar. b) Также подключите свой поисковый бар к Outlet в своем классе. Я только что назвал мой поискБар. c) из viewDidLoad вы хотите получить свойство textField внутри searchBar. Я сделал это так.

UITextField *textField = [self.searchBar valueForKey:@"_searchField"];
if (textField) {
    textField.delegate = self;
    textField.tag = 1000;
}

Обратите внимание: я назначил тег этому текстовому полю, чтобы я мог его снова захватить, и я сделал его делегатом textField. Вы могли бы создать свойство и назначить этот textField этому свойству, чтобы захватить его позже, но я использовал тег.

Отсюда вам просто нужно вызвать метод делегата:

-(BOOL)textFieldShouldClear:(UITextField *)textField {
if (textField.tag == 1000) {
    // do something
    return YES;
}
return NO;

}

Что это. Поскольку вы имеете в виду private valueForKey, я не могу гарантировать, что это не приведет вас к неприятностям.

Ответ 7

Вы можете попробовать следующее:

- (void)viewDidLoad
{
    [super viewDidLoad];
    for (UIView *view in searchBar.subviews){
        for (UITextField *tf in view.subviews) {
            if ([tf isKindOfClass: [UITextField class]]) {
                tf.delegate = self;
                break;
            }
        }
    }
}

- (BOOL)textFieldShouldClear:(UITextField *)textField {
     // your code
    return YES;
}

Ответ 8

Лучшее решение из моего опыта - просто поместить UIButton (с четким фоном и без текста) над кнопкой очистки системы и подключить IBAction

- (IBAction)searchCancelButtonPressed:(id)sender {

    [self.searchBar resignFirstResponder];
    self.searchBar.text = @"";

    // some of my stuff
    self.model.fastSearchText = nil;
    [self.model fetchData];
    [self reloadTableViewAnimated:NO];

}

Ответ 9

Не удалось найти решение здесь, которое не использовало частный API или не было доказательством обновления, поскольку Apple меняет структуру представления UISearchBar. Вот что я написал, что работает:

- (void)viewDidLoad {
    [super viewDidLoad];

    UITextField* textfield = [self findTextFieldInside:self.searchBar];
    [textfield setDelegate:self];
}

- (UITextField*)findTextFieldInside:(id)mainView {
    for (id view in [mainView subviews]) {
        if ([view isKindOfClass:[UITextField class]]) {
            return view;
        }

        id subview = [self findTextFieldInside:view];
        if (subview != nil) {
            return subview;
        }
    }

    return nil;
}

Затем реализуем протокол UITextFieldDelegate в ваш класс и перезаписываем метод textFieldShouldClear:

- (BOOL)textFieldShouldClear:(UITextField*)textField {
    // Put your code in here.
    return YES;
}

Изменить: Установка делегата в текстовое поле панели поиска в iOS8 приведет к сбою. Однако это похоже на метод searchBar: textDidChange: метод будет вызываться в iOS8 на явном уровне.