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.mainviewWillAppearviewDidAppear 中添加searchController.isActive = truesearchController.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 的同时出现?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Swift 在 iOS 中检测多行键盘粘贴事件?

IOS swift如何让我的子视图出现在我的搜索栏下方

Swift:UITextField 被键盘隐藏

如何在iOS Swift 3中从键盘中删除更改语言键按钮

当使用 Swift 出现键盘时如何向上移动 UIViewController 的内容

键盘出现时UITextField上移【Swift】