Автоматически показывать клавиатуру при загрузке UISearchController

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

Я сделал контроллер поиска активным в методе viewDidLoad, используя

self.mySearchController.active = true

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

self.mySearchController.searchBar.becomeFirstResponder()

Эта строка, кажется, не имеет никакого эффекта.

Как вызвать клавиатуру автоматически/программно? Ниже приведена более подробная версия моего кода

class PickAddressViewController: UITableViewController, UISearchResultsUpdating {

var searchText = ""

var mySearchController = UISearchController()

override func viewDidLoad() {
    super.viewDidLoad()

    self.mySearchController = ({
        let controller = UISearchController(searchResultsController: nil)
        controller.searchResultsUpdater = self
        controller.dimsBackgroundDuringPresentation = false
        controller.searchBar.sizeToFit()
        controller.searchBar.text = self.searchText

        self.tableView.tableHeaderView = controller.searchBar

        return controller
    })()

    self.mySearchController.active = true
    self.mySearchController.searchBar.becomeFirstResponder()
}

person RookiePro    schedule 28.06.2015    source источник


Ответы (6)


BecomeFirstResponder — это путь, но вы должны делать это не в viewDidLoad. Подробности см. в следующем обсуждении: Невозможно установить searchBar как firstResponder

person Nikita Leonov    schedule 29.06.2015
comment
Большой! Я попробовал решение по этой ссылке, и оно работает! Для любых других новичков, таких как я, в дополнение к коду, который я написал в своем вопросе выше, вы должны сделать следующее: сделать контроллер представления UISearchControllerDelegate. При определении контроллера поиска напишите строку, в которой говорится, что controller.delegate = self. Поместите строку beFirstResponder в функцию делегата с именем 'didPresentSearchController' - person RookiePro; 29.06.2015

Я также попробовал предложения, перечисленные в ссылке, упомянутой Никитой Леоновым. Мне нужно было добавить класс UISearchControllerDelegate и UISearchBarDelegate, и тогда это сработало. я не ты

class PickAddressViewController: UITableViewController, UISearchControllerDelegate, UISearchBarDelegate, UISearchResultsUpdating {

    override func viewDidLoad() {
        super.viewDidLoad()

        self.mySearchController = ({
            controller.searchBar.delegate = self
        })()

        self.mySearchController.active = true
        self.mySearchController.delegate = self
    }

    func didPresentSearchController(searchController: UISearchController) {
        self.mySearchController.searchBar.becomeFirstResponder()
    }
    …
}
person empedocle    schedule 29.06.2015

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(true)
    self.navigationItem.titleView = searchController!.searchBar
    dispatch_async(dispatch_get_main_queue(), {
        self.searchController?.active = true
        self.searchController!.searchBar.becomeFirstResponder()
    })
}

и этот код

func presentSearchController(searchController: UISearchController) {
    searchController.searchBar.becomeFirstResponder()
}

убедитесь, что вы указали searchController?.delegate = self в viewDidLoad(). Протестировано на устройстве iOS 9.*

person anuraagdjain    schedule 05.08.2016

Решение Swift 3 в моем случае:

override func viewDidLoad() {
    super.viewDidLoad()
    navigationItem.titleView = mySearchController.searchBar
    mySearchController.searchResultsUpdater = self
    mySearchController.delegate = self

}

override func viewDidAppear(_ animated: Bool) {
    DispatchQueue.main.async {
        self.mySearchController.isActive = true
    }
}

func presentSearchController(_ searchController: UISearchController) {
    mySearchController.searchBar.becomeFirstResponder()
}
person Vitya Shurapov    schedule 06.02.2017

Свифт 5

  1. in viewDidLoad:
searchViewController.delegate = self
  1. in viewDidAppear:
searchViewController.isActive = true

Это активирует SearchController

  1. Определите метод делегата:
extension MyViewController: UISearchControllerDelegate {
    func didPresentSearchController(_ searchController: UISearchController) {
        DispatchQueue.main.async {
            searchController.searchBar.becomeFirstResponder()
        }
    }
}
person Tung Fam    schedule 10.10.2020
comment
Я пробую этот метод, но с другим подходом. Итак, я нажимаю на свой контроллер поиска, затем оттуда нажимаю на новый контроллер представления, и когда я возвращаюсь, я хочу, чтобы моя клавиатура была видна. Прямо сейчас все выглядит вызываемым, но моя клавиатура не видна. Мне нужно снова нажать на панель поиска UISearchController, чтобы сделать ее видимой. Какие-либо предложения? - person Luke Irvin; 12.02.2021

Помимо того, что предложили другие пользователи, я также сделал следующее, и это сработало:

searchController.definesPresentationContext = true

person Natan R.    schedule 22.11.2015