Вызывая кнопку отмены и программную клавиатуру, чтобы автоматически появиться в viewDidLoad () - PullRequest
0 голосов
/ 18 июня 2019

Примечание: я пытался использовать .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
}

Клавиатура и кнопка отмены в настоящее время появляются только тогда, когда пользователь нажимает внутри текстового поля. Нажатие в любом месте экрана приводит к их исчезновению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...