Отключение клавиатуры от UISearchBar при нажатии кнопки X - PullRequest
18 голосов
/ 16 ноября 2010

Я использую UISearchBar (но не SearchDisplayController, который обычно используется в сочетании), и я хотел бы отключить клавиатуру, когда вы нажмете кнопку «X».

Я следовал Предложение TomSwift о вызове, когда нажимается 'X', и это прекрасно работает.Но отставка первого респондента из текстового поля, а также вызов в экземпляре UISearchBar, оба с resignFirstResponder, не заставят клавиатуру исчезнуть.

Есть ли способ избавиться от клавиатуры, когда пользователь нажал кнопку X?

Вот что я сделал, чтобы получить уведомление «Очистить»:

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

Затем у меня есть настройки класса для реализации UISearchBarDelegate и UITextFieldDelegate.

Наличие класса serveпоскольку делегат текстового поля позволяет мне получить этот вызов:

- (BOOL)textFieldShouldClear:(UITextField *)textField
{
     [textField resignFirstResponder];
     [self.searchBar resignFirstResponder];
     return YES;
}

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

Ответы [ 13 ]

0 голосов
/ 28 ноября 2016

Другая точка зрения для ясного текстового потока (похожа на ответ @TomSwift, но более понятна для меня и менее хитра).Кроме того, мне нужно скрыть кнопку «Отмена» после выхода из панели поиска, реализовать поиск в реальном времени (после каждого символа) и таблицу обложек до того, как пользователь завершит поиск.

//self.searchHoverView can cover table view
//performSearchWithSearchBar: method for performing search

#pragma mark - UISearchBarDelegate

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar {
    [searchBar setShowsCancelButton:YES animated:YES];
    self.searchHoverView.hidden = NO;
}

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
    if (searchText.length) {
        [self performSearchWithSearchBar:searchBar];
    } else {
        UIButton *button;
        for (UIView *subView in [searchBar subviews]) {
            for (UIView *view in [subView subviews]) {
                if ([view isKindOfClass:[UIButton class]]) {
                    button = (UIButton *)view;
                    break;
                }
            }
        }

        if (button) {
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                [button sendActionsForControlEvents:UIControlEventTouchUpInside];
            });
        }
    }
}

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar {
    self.searchBar.text = nil;

    [self.searchBar setShowsCancelButton:NO animated:YES];
    [self.searchBar resignFirstResponder];

    self.searchHoverView.hidden = YES;
}
0 голосов
/ 16 сентября 2016

Благодарность Maxhs за оригинальный ответ: Это версия Swift 2.2: работа для меня как шарм

if searchBar.text == "" {
                dispatch_async(dispatch_get_main_queue(), { 
                    self.searchBar.resignFirstResponder()
                })
            }
0 голосов
/ 28 октября 2014

РЕДАКТИРОВАТЬ: На самом деле, ниже разбивает делегат, который подключен к UISearchBar.Просто создайте подкласс UISearchBar и перезапишите метод делегата UITextField.

=================================

Iпришлось сделать это, чтобы получить доступ к UITextView

for (UIButton* v in [self.searchBar.subviews[0] subviews])
{
    if ( [v isKindOfClass: [UITextField class]] )
    {
        UITextField *tf = (UITextField *)v;
        tf.delegate = self;
        break;
    }
}
...