我在导航栏中有一个UISearchController
,它一直运行到现在。
仅在iOS 9上,搜索栏在加载控制器后拒绝成为第一个响应者。
viewDidLoad
中的代码:
self.searchController = ({
let controller = UISearchController(searchResultsController: nil)
controller.searchResultsUpdater = self
controller.delegate = self
controller.dimsBackgroundDuringPresentation = false
let ownSearchBar = controller.searchBar
ownSearchBar.searchBarStyle = .Default
ownSearchBar.barStyle = UIBarStyle.Black
ownSearchBar.placeholder = NSLocalizedString("Search", comment: "Search")
ownSearchBar.showsCancelButton = true
ownSearchBar.sizeToFit()
ownSearchBar.delegate = self
controller.searchBar.delegate = self
controller.hidesNavigationBarDuringPresentation = false
self.navigationItem.titleView = controller.searchBar
self.navigationItem.hidesBackButton = true
self.navigationController?.navigationBar.sizeToFit()
return controller
})()
viewDidAppear中的代码:
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
self.searchController.active = true
self.searchController.searchBar.text = state.term
self.segmentedControl.selectedSegmentIndex = state.searchType
}
我的代码在didPresentSearchController
:
extension SearchController : UISearchControllerDelegate {
func didPresentSearchController(searchController: UISearchController){
self.searchController.searchBar.becomeFirstResponder()
xButtonWasPressed = true
}
}
请帮助我找到为什么只有在iOS 9中搜索栏才能获得焦点
答案 0 :(得分:3)
对我来说同样的问题。在iOS 8上运行良好但在iOS 9上停止工作。
错误是 didPresentSearchController:方法应该是已经加载的SearchController,但事实并非如此。
所以我们需要加载一些延迟。我的丑陋但有效的解决方案是
func didPresentSearchController(searchController: UISearchController) {
UIView.animateWithDuration(0.1, animations: { () -> Void in }) { (completed) -> Void in
searchController.searchBar.becomeFirstResponder()
}
}
在此方法的已完成部分中拥有 becomeFirstResponder()非常重要,因为它是加载SearchController时的部分
希望它有所帮助!
答案 1 :(得分:1)
有用的东西...
在 viewDidLoad 中将 self 设置为搜索栏的委托 searchController.delegate = self
在 viewDidAppear 中设置 self.searchController.isActive = true
。如果您在 viewWillAppear 中执行此操作,则可能无法立即使用
使用 UISearchControllerDelegate 方法激活键盘
func presentSearchController(_ searchController: UISearchController) {
DispatchQueue.main.async {
searchController.searchBar.becomeFirstResponder()
}
}
}
注意:有一个名为 didPresentSearchController
的方法,您可能会认为它是可以使用的方法,但只有在系统自动显示搜索栏时才会触发。
答案 2 :(得分:0)
使用以下代码:
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
self.countrySearchBar.becomeFirstResponder()
}
这里" countrySearchBar"是您的搜索栏的出口。
请检查我的GitHub链接以测试示例项目:
https://github.com/k-sathireddy/SearchDisplayControllerSample