画面描画時に UISearchController の searchBar にフォーカスが当たりキーボードが表示されている状態になってほしい。
viewDidLoad
とかで searchController.searchBar.becomeFirstResponder()
を呼べばいけるかな〜と思ったけどちょっと頑張らないといけなかったのでメモ。
前提
すでに画面に searchBar が表示されるくらいのコードはできていること。
searchController.isActive = true
viewDidAppear
で searchController.isActive = true
にする。
Active になると SearchBar のキャンセルボタンが表示される状態になる。
override func viewDidAppear(_ animated: Bool) {
searchController.isActive = true
}
UISearchControllerDelegate
UISearchControllerDelegate
にある didPresentSearchController
内で becomeFirstResponder
を呼ぶ。
delegate を使うということは、 viewDidLoad
などで searchController.delegate = self
などしておく必要がある。
extension MyViewController: UISearchControllerDelegate {
func didPresentSearchController(_ searchController: UISearchController) {
searchController.searchBar.becomeFirstResponder()
}
}
これで画面描画時に自動で searchBar にフォーカスが当たり、キーボードが出るはず!
searchController のロードが完了しないと becomeFirstResponder()
が利かないらしく、表示を待つ必要があるとのこと。
全体
実際のコードが必要なところを削ぎ落としたので、もしかしたらエラー出て動かないかもです。。
全体としてこんな感じで実装できますという、雰囲気を掴んでいただければ。
import UIKit
class MyViewController: UIViewController {
@IBOutlet weak var tableView: UITableView!
var searchController = UISearchController(searchResultsController: nil)
override func viewDidLoad() {
super.viewDidLoad()
searchController.delegate = self
tableView.tableHeaderView = searchController.searchBar
}
override func viewDidAppear(_ animated: Bool) {
searchController.isActive = true
}
}
extension MyViewController: UISearchControllerDelegate {
func didPresentSearchController(_ searchController: UISearchController) {
searchController.searchBar.becomeFirstResponder()
}
}
参考
ios - Cannot set searchBar as firstResponder - Stack Overflow