我在UISearchController
中有navigationItem.searchController
,当用户从菜单中选择“搜索”时,我想使其聚焦。
因此,不久之后,当用户点击菜单(UITableViewCell
)中的“搜索”选项时,将获得包含searchController
的视图控制器并调用:
guard let navigationVC = presentingViewController as? UINavigationController else { return }
guard let documentsVC = navigationVC.topViewController as? DocumentsViewController else { return }
documentsVC.searchController.searchBar.becomeFirstResponder()
然后,UISearchBar
变得聚焦,键盘出现,然后立即消失,我没有有任何使其消失的代码(例如{{1 }}。
答案 0 :(得分:1)
因此,经过多次尝试,我找到了使其工作的某种方法,但是我敢肯定,还有很多更优雅的方法可以做到这一点,所以如果有人认为他们有更好的方法,请在此处发布,我可能会用它并将您的答案标记为正确的答案。
在focusOnSearchBar()
中创建函数YourViewController
:
func focusOnSearchBar() {
let searchBar = searchController.searchBar
if searchBar.canBecomeFirstResponder {
DispatchQueue.main.async {
searchBar.becomeFirstResponder()
}
} else {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
self.focusOnSearchBar()
}
}
}
它的实际作用是递归使用自身,并每0.1秒检查一次searchBar.canBecomeFirstResponder
。 这是有问题的/不是很优雅的事情。
然后,将其添加到viewDidAppear()
:
if focusOnSearch {
searchController.isActive = true
}
别忘了为UISearchControllerDelegate
(当然,设置searchController.delegate = self
)的ViewController添加扩展并实现didPresentSearchController
(将通过设置searchController.isActive = true
来调用) ):
extension YourViewController: UISearchControllerDelegate {
func didPresentSearchController(_ searchController: UISearchController) {
if focusOnSearch {
focusOnSearchBar()
}
}
}
现在您要做的就是在focusOnSearch = true
中设置prepare(for segue:sender:)
。
*注意::如果您想在viewController
的同一searchBar
中聚焦focusOnSearchBar,只需设置:
focusOnSearch = true
searchController.isActive = true
它会自行工作。
答案 1 :(得分:0)
在viewDidLoad方法中使搜索栏成为第一响应者。这样可以确保在聚焦搜索栏之前一切都准备就绪。