Примечание: я пытался использовать .becomeFirstResponder (), как показано в ссылке выше. Я тупо оставил эту деталь в своем первом посте. Смотрите мой код для правок.
Я использую UISearchBar в своем собственном выделенном viewController (код, используемый для панели поиска, взят из Google как часть их SDK). Как только приложение перейдет в этот viewController, я хочу, чтобы клавиатура появлялась немедленно без вмешательства пользователя, и я не хочу, чтобы она исчезла. Что еще более важно, я хотел бы, чтобы кнопка отмены оставалась видимой всегда.
Я уже знаю, как заставить клавиатуру исчезать с помощью resignFirstResponder. Я пытался использовать .becomeFirstResponder () безрезультатно. Однако, глядя на StackOverflow, Google и документацию Apple, я не вижу способа заставить его появиться без вмешательства пользователя.
Все функции, такие как editDidBegin (), требуют, чтобы пользователь что-то сделал.
Это кажется довольно простым, но я выхожу пустым.
private var resultsViewController: GMSAutocompleteResultsViewController?
private var searchController: UISearchController?
private var resultView: UITextView?
// tableview code for Google autocomplete
private var tableDataSource: GMSAutocompleteTableDataSource?
// не включая неактуальный код ...
// вызывается в viewDidLoad ()
func displaySearchBar () {
let searchVerticalLocation = UIScreen.main.bounds.height-UIScreen.main.bounds.height+33
resultsViewController = GMSAutocompleteResultsViewController()
resultsViewController?.delegate = self
//resultsViewController.becomeFirstResponder() doesn't work
searchController = UISearchController(searchResultsController: resultsViewController)
searchController?.searchResultsUpdater = resultsViewController
let subView = UIView(frame: CGRect(x: 0, y: searchVerticalLocation, width: 350, height: 60))
searchController?.searchBar.barTintColor = UIColor(red: 234/255.0, green: 93/255.0, blue: 0/255.0, alpha: 1.0)
searchController?.searchBar.keyboardAppearance = .dark
searchController?.searchBar.searchBarStyle = .prominent
searchController?.searchBar.placeholder = "enter destination"
searchController?.searchBar.isTranslucent = true
searchController?.searchBar.leftAnchor.constraint(equalTo: subView.leftAnchor, constant: 100)
searchController?.searchBar.rightAnchor.constraint(equalTo: subView.rightAnchor, constant: -100)
searchController?.searchBar.delegate = self
UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).setTitleTextAttributes([NSAttributedString.Key(rawValue: NSAttributedString.Key.foregroundColor.rawValue): UIColor.white], for: .normal)
//Everything with this tap recognizer is an attempt to ensure that the cancel button on the searchbar doesn't disappear.
let singleTapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.cancelSearchBar(sender:)))
singleTapGestureRecognizer.delegate = self
singleTapGestureRecognizer.numberOfTapsRequired = 1
singleTapGestureRecognizer.isEnabled = true
singleTapGestureRecognizer.cancelsTouchesInView = false
searchController?.searchBar.addGestureRecognizer(singleTapGestureRecognizer)
subView.addSubview((searchController?.searchBar)!)
view.insertSubview(subView, at: 1)
// When UISearchController presents the results view, present it in
// this view controller, not one further up the chain.
definesPresentationContext = true
searchController?.isActive = true
searchController?.searchBar.becomeFirstResponder()
//searchController?.becomeFirstResponder() doesn't work either
}
// this code brings back the cancel button if the user taps in the searchbar's text field. It's an imperfect solution. I'd rather have it so that the searchbar doesn't disappear at all. Not sure how to make that happen yet.
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
searchController?.isActive = true
return true
}
Клавиатура и кнопка отмены в настоящее время появляются только тогда, когда пользователь нажимает внутри текстового поля. Нажатие в любом месте экрана приводит к их исчезновению.