【问题标题】:Keyboard is appearing and immediately disappearing when UISearchBar.becomeFirstResponder() is getting called当 UISearchBar.becomeFirstResponder() 被调用时,键盘出现并立即消失
【发布时间】:2018-10-13 19:38:07
【问题描述】:

我在navigationItem.searchController 中有UISearchController,当用户从菜单中选择“搜索”时,我想让它成为焦点。 很快,当用户点击菜单中的“搜索”选项 (UITableViewCell) 时,它会获取包含 searchController 的视图控制器并调用:

guard let navigationVC = presentingViewController as? UINavigationController else { return }
guard let documentsVC = navigationVC.topViewController as? DocumentsViewController else { return }
documentsVC.searchController.searchBar.becomeFirstResponder()

然后,UISearchBar 获得焦点,键盘出现,然后立即消失,我没有有任何代码可以使它消失(如 view.endEditing())。

1 GIF 价值超过 1,000 字:

【问题讨论】:

  • 在调用documentsVC.searchController.searchBar.becomeFirstResponder() 之前,您能否尝试将searchControllerisActive 属性设置为true?另外,确保在主线程上调用了documentsVC.searchController.searchBar.becomeFirstResponder()
  • 也试过了,还是不行:documentsVC.searchController.isActive = true DispatchQueue.main.async { documentsVC.searchController.searchBar.becomeFirstResponder() }
  • 我注意到当我这样做时它正在工作:DispatchQueue.main.asyncAfter(deadline: .now() + 0.4) { documentsVC.searchController.searchBar.becomeFirstResponder() } 但我想做一些不会在特定时间领先的事情,因为现在我正在 iPhone 上运行它X 与 iOS 12,可能在其他旧版本的设备上需要更多时间。
  • 我认为这意味着当您调用documentVC.searchController.searchBar.becomeFirstResponder 时 SearchController 仍未完全加载。您是否尝试过在documentsViewControllerviewDidAppear 内部做同样的事情?我希望这可以指出可能是什么问题。
  • 它只是变得“活跃”,但没有出现键盘(当我从viewDidAppear 调用代码时)。这就是问题所在,我不知道如何检测searchBar 何时准备好becomeFirstResponder

标签: ios swift uisearchbar uisearchcontroller swift4.2


【解决方案1】:

所以,经过多次尝试后,我找到了一些让它工作的方法,但我确信有更优雅的方法可以做到这一点,所以 如果有人认为他们有更好的方法,请在此处发布 我可能会使用它并将您的答案标记为正确的答案。

YourViewController中创建函数focusOnSearchBar()

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
}

不要忘记为您的 ViewController 添加扩展 UISearchControllerDelegate(当然,设置 searchController.delegate = self)并实现 didPresentSearchController(将通过设置 searchController.isActive = true 来调用):

extension YourViewController: UISearchControllerDelegate {
  func didPresentSearchController(_ searchController: UISearchController) {
    if focusOnSearch {
      focusOnSearchBar()
    }
  }
}

现在您所要做的就是在prepare(for segue:sender:) 中设置focusOnSearch = true

*注意:如果你想在searchBar 的同一个viewController 中聚焦OnSearchBar,只需设置:

 focusOnSearch = true
 searchController.isActive = true

它会自己工作。

【讨论】:

    【解决方案2】:

    在 viewDidLoad 方法中让您的搜索栏成为第一响应者。这将确保在聚焦搜索栏之前一切准备就绪。

    【讨论】:

    • 当我在 viewDidLoad() 中调用它时,它甚至不会像在 GIF 中那样关注 searchBar,什么也没有发生。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 2019-03-31
    相关资源
    最近更新 更多