调用UISearchBar.becomeFirstResponder()时,键盘出现并且立即消失

时间:2018-10-13 19:38:08

标签: ios swift uisearchbar uisearchcontroller swift4.2

我在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 }}。

1个GIF值超过1,000个单词: Keyboard is appearing and immediately disappearing when UISearchBar.becomeFirstResponder() is getting called

2 个答案:

答案 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方法中使搜索栏成为第一响应者。这样可以确保在聚焦搜索栏之前一切都准备就绪。