Swift iOS - 如何让键盘在出现 SearchController 的同时出现?
Posted
技术标签:
【中文标题】Swift iOS - 如何让键盘在出现 SearchController 的同时出现?【英文标题】:Swift iOS -How to get keyboard to present itself at the same exact time a SearchController is presented? 【发布时间】:2018-07-31 17:30:18 【问题描述】:就上下文而言,我的键盘成功出现,所以这不是问题。
我有一个 searchButton 作为我的 rightBarButtonItem,当按下它时,它会模态地呈现一个包含 SearchController 的 vc。当 SearchController 出现时,键盘也出现了,但键盘出现的时间晚了一秒,在它出现之前有 1 秒的延迟。基本上 vc 出现在场景中,然后出现键盘,我无法在出现 SearchController 的同时出现键盘。我在 YouTube 和 Vimeo 的 ios 应用上,当我按下他们的搜索按钮时,键盘会同时显示 SearchController,没有 1 秒的延迟。
如何让键盘在 SearchController 呈现自己的同时呈现自己?
模态显示 SearchController 的按钮:
@objc func searchButtonTapped()
let searchVC = SearchController()
let nav = UINavigationController(rootViewController: searchVC)
present(nav, animated: true, completion: nil)
搜索控制器:
我已经尝试在DispatcQeue.main
和viewWillAppear
和viewDidAppea
r 中添加searchController.isActive = true
和searchController.searchBar.becomeFirstResponder()
并没有区别
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()
【问题讨论】:
您是否将navigationItem.searchController
设置为您的UISearchController
?如果是这样,它将为您处理所有键盘隐藏和显示。
@NRitH 你是什么意思,我在什么时候设置它。我上面列出的代码与我当前使用的代码完全相同
【参考方案1】:
肯定有延迟..那些动画完成了,然后键盘出现了。
present(nav, animated: true, completion: nil)
【讨论】:
我没有问为什么会有延迟我是问如何防止延迟。 把这个放在 viewWillAppear self.searchController.searchBar.becomeFirstResponder() 我已经试过了。我在 mainqueue 上做了,没有任何区别。不过感谢您的建议。【参考方案2】:请试试这个。 如果您不使用动画预设视图控制器,它将立即打开键盘,但如果我们呈现视图控制器动画,它会在当前动画完成后打开键盘。 谢谢。
override func viewDidAppear(_ animated: Bool)
super.viewDidAppear(true)
DispatchQueue.main.async
self.searchController.searchBar.becomeFirstResponder()
【讨论】:
@LanceSamaria 你也试过没有动画吗? 还有一点延迟,但是vc突然出现了。这会导致糟糕的用户体验。感谢您的建议。 @LanceSamaria 你也可以这样尝试。覆盖 func viewDidAppear(_ animated: Bool) super.viewDidAppear(true) DispatchQueue.main.async UIView.performWithoutAnimation self.searchController.searchBar.becomeFirstResponder() 如果有帮助。谢谢 我在 viewDidAppear 和 viewWillAppear 都试过了,没区别,谢谢以上是关于Swift iOS - 如何让键盘在出现 SearchController 的同时出现?的主要内容,如果未能解决你的问题,请参考以下文章