Зачем вызывать resignFirstResponder () асинхронно в основной очереди, чтобы закрыть клавиатуру - PullRequest
1 голос
/ 13 марта 2020

Я использую UISearchBar для фильтрации данных для табличного представления и хочу, чтобы клавиатура была отключена, когда на панели поиска нет текста запроса (текст удаляется нажатием кнопки удаления клавиатуры или нажатием кнопки очистки панели поиска). Основываясь на том, что я узнал из других сообщений о stackoverflow, я понимаю, что нажатие кнопки очистки панели поиска (серая круглая кнопка со значком x) покажет клавиатуру, даже если вы вызываете searchBar.resignFirstResponder () в методе textDidChange UISearchBarDelegate. Поэтому, если вы нажмете кнопку очистки панели поиска, клавиатура будет скрыта, а затем снова вернется назад sh, а при удалении текста вручную клавиатура будет скрыта.

Единственным решением является вызов метода resignFirstResponder () внутри блока кода DispatchQueue.main.asyn c.

Может кто-нибудь объяснить, почему необходимо вызывать метод resignFirstResponder () асинхронно в основной очереди распустить клавиатуру? почему вызов напрямую не работает?

Проверьте код ниже:

    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        if searchBar.text?.count == 0 {
            loadItems()

            //the following code works!
            DispatchQueue.main.async {
                searchBar.resignFirstResponder()
            }

//            //this line of code only works when you tap the deleting keyboard button to remove the query text
//            //does not work if you click the searchbar clear button
//            searchBar.resignFirstResponder()
        }
    }

Ответы [ 3 ]

1 голос
/ 13 марта 2020

Проще говоря, это потому, что вы не можете заставить панель поиска уйти в отставку первым респондентом, пока он не закончил с вами разговаривать. Поэтому вам нужно дождаться выхода из метода делегата textDidChange. Это то, что асинхронно повторяет вход в основной поток.

0 голосов
/ 13 марта 2020

Если вам просто интересно, почему это происходит, @matt прав. В дополнение к его ответу уже существует метод UISearchBarDelegate, который срабатывает при нажатии кнопки отмены. Таким образом, вы можете подать в отставку первым респондентом в этом методе.

func searchBarCancelButtonClicked(_ searchBar: UISearchBar)

Я думаю, что это может помочь в том, что вы хотите достичь.

0 голосов
/ 13 марта 2020

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

...