我在表视图控制器中创建了一个UISearchController。我使用来自另一个视图控制器的push segue来查看此表视图控制器。我希望一旦按下表视图控制器,键盘就会在搜索栏中显示光标。
我使用
在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()
}
答案 0 :(得分:4)
BecomeFirstResponder是要走的路,但你不应该在viewDidLoad中这样做。有关详细信息,请参阅以下讨论 - Cannot set searchBar as firstResponder
答案 1 :(得分:3)
我也尝试过Nikita Leonov提到的链接中列出的建议。我需要将类添加为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()
}
…
}
答案 2 :(得分:2)
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()
}
确保你给予
viewDidLoad()中的searchController?.delegate = self
。在iOS 9. *设备上测试
答案 3 :(得分:1)
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()
}
答案 4 :(得分:0)
除了做其他用户建议的内容外,我还做了以下工作,并且有效:
searchController.definesPresentationContext = true
答案 5 :(得分:0)
viewDidLoad
中:searchViewController.delegate = self
viewDidAppear
中:searchViewController.isActive = true
这将激活SearchController
extension MyViewController: UISearchControllerDelegate {
func didPresentSearchController(_ searchController: UISearchController) {
DispatchQueue.main.async {
searchController.searchBar.becomeFirstResponder()
}
}
}