Swift 5和iOS 13 UISearchController错误的呈现和消除行为

War*_*der 6 ios swift uisearchcontroller swift5 ios13

当我将项目更新到iOS 13时,我遇到了异常问题。我有显示和处理某些UISearchController动作的逻辑(下面的代码),所有部分在iOS 11和12中均正常运行。

我的任务是在导航栏中添加搜索按钮,以UISearchController在按钮操作后显示。

但是在iOS 13中,我遇到了2个问题:

从按钮动作调用的代码

func showSearch() {
        let searchResultsController = LUSearchResultsViewController()...
        let searchController = UISearchController(searchResultsController: searchResultsController)
        searchController.delegate = self
        searchController.searchResultsUpdater = searchResultsController
        navigationItem.searchController = searchController
        definesPresentationContext = true
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
            searchController.isActive = true
        }
}
Run Code Online (Sandbox Code Playgroud)

只有一种解决方案可以帮助我显示搜索控制器,而与以前的iOS版本没有任何区别。

DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
            searchController.isActive = true
}
Run Code Online (Sandbox Code Playgroud)

在iOS 13,iOS 11和12上运行的代码无需asyncAfter

帮助我隐藏UISearchController和设置iOS 11和12(而非13)中的导航栏初始状态的代码。在SearchBar上点击“ 取消 ” 后,UISearchController开始调用委托方法。

  //MARK: UISearchControllerDelegate


    public func willDismissSearchController(_ searchController: UISearchController) {
         self.navigationItem.searchController = nil
    }
Run Code Online (Sandbox Code Playgroud)

设置navigationItem.searchController = nil didPresentSearchController两次呼叫后,不仅可以UISearchController关闭,还可以访问整个UIViewController层次结构UIWindow。或者,如果我在asyncAfter此处添加,我会随着导航栏高度的增加而正常解雇,这是我不需要的。

所以

  1. 我认为asyncAfter在狗指甲中,您将如何解决此问题?
  2. 如何正确关闭UISearchController?

小智 0

我可以帮助你完成第一部分。

您可以使用以下命令来代替异步部分:

searchController.searchBar.layoutIfNeeded()        
searchController.isActive = true
Run Code Online (Sandbox Code Playgroud)

SearchController 在该特定时刻尚未准备好,需要先进行布局才能激活。

通过对 searchBar 进行布局,我们强制执行此操作,并且只有在有需要布局的内容时才会触发。