Lance Samaria
Lance Samaria

Reputation: 19582

Swift iOS -How to get keyboard to present itself at the same exact time a SearchController is presented?

Just for context my keyboard successfully appears so that's not the problem.

I have a searchButton as my rightBarButtonItem, when pressed it modally presents a vc that contains a SearchController. When the SearchController is presented the keyboard is also presented but the keyboard appears a second late, there's like a 1 second delay before it shows itself. Basically the vc appears on the scene and then the keyboard appears afterwards, I cannot get the keyboard to appear at the same time the SearchController is presented. I was on YouTube's and Vimeo's iOS apps and when I pressed their search button the keyboard is presented with the SearchController at the same exact time, there isn't a 1 second delay.

How can I get the keyboard to present itself at the same time the SearchController is presenting itself?

button to modally present SearchController:

@objc func searchButtonTapped() {
    let searchVC = SearchController()
    let nav = UINavigationController(rootViewController: searchVC)
    present(nav, animated: true, completion: nil) 
}

SearchController: I've already tried adding searchController.isActive = true and searchController.searchBar.becomeFirstResponder() in DispatcQeue.main in viewWillAppear and viewDidAppear and it made no difference

class SearchController: UIViewController {

var searchController: UISearchController!

override func viewDidLoad() {
    super.viewDidLoad()

    searchController = UISearchController(searchResultsController: nil)
    searchController.delegate = self
    searchController.searchBar.delegate = self
    searchController.searchResultsUpdater = self
    searchController.searchBar.showsCancelButton = true
    searchController.searchBar.placeholder = "Search"
    searchController.searchBar.returnKeyType = .search
    searchController.dimsBackgroundDuringPresentation = false
    searchController.hidesNavigationBarDuringPresentation = false
    searchController.searchBar.sizeToFit()
    searchController.searchBar.tintColor = UIColor.black

    definesPresentationContext = true
    navigationItem.hidesBackButton = true
    navigationItem.titleView = searchController.searchBar
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    searchController.isActive = true
}

// I tried both of these searchContrller delegate methods SEPERATELY but it made no difference, there's still a 1 second delay
func presentSearchController(_ searchController: UISearchController) {
    DispatchQueue.main.async {
        self.searchController.searchBar.becomeFirstResponder()
    }
}

func didPresentSearchController(_ searchController: UISearchController) {
    DispatchQueue.main.async {
        self.searchController.searchBar.becomeFirstResponder()
    }
}

}

Upvotes: 1

Views: 238

Answers (2)

rohit chauhan
rohit chauhan

Reputation: 23

Please try this. It will immediately open the keyboard if you would not preset view controller with an animation but if we present view controller animation it opens keyboard after the present animation is finished. Thanks.

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(true)
    DispatchQueue.main.async {
        self.searchController.searchBar.becomeFirstResponder()
    }
}

Upvotes: 0

MAGiGO
MAGiGO

Reputation: 608

Sure there is a delay.. ones this animation is completed, then keyboard appears.

 present(nav, animated: true, completion: nil) 

Upvotes: 1

Related Questions