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

问题描述 投票:6回答:2

[当我将项目更新到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
        }
}

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

DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
            searchController.isActive = true
}

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

帮助我隐藏UISearchController并设置导航栏初始状态的代码在iOS 11和12中,而不是在13中。在SearchBar上点击cancel后,UISearchController开始调用委托方法。

  //MARK: UISearchControllerDelegate


    public func willDismissSearchController(_ searchController: UISearchController) {
         self.navigationItem.searchController = nil
    }

BUT

设置了navigationItem.searchController = nil之后,didPresentSearchController调用了两次,不仅取消了UISearchController,而且还取消了UIViewController的整个UIWindow层次结构。或者,如果我在此处添加asyncAfter,我将获得正常的解雇,并具有扩展的导航栏高度,这是我所不需要的。

SO

  1. 我认为asyncAfter放在狗爪中,您将如何解决此问题?
  2. 我如何正确关闭UISearchController?
ios swift uisearchcontroller ios13 swift5
2个回答
0
投票

我可以为您提供第一部分的帮助。

代替执行异步部分,您可以使用此:

searchController.searchBar.layoutIfNeeded()        
searchController.isActive = true

SearchController在那个特定时刻还没有准备好,它需要先布局才能变得可用。

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


0
投票

此问题发生在iOS 13

添加searchController.extendedLayoutIncludesOpaqueBars = true

以及

`
extension SearchViewController:UISearchControllerDelegate{
    func willPresentSearchController(_ searchController: UISearchController) {
        if #available(iOS 13, *){
            self.navigationController?.navigationBar.isTranslucent = true
        }
    }
    func willDismissSearchController(_ searchController: UISearchController) {
        if #available(iOS 13, *){
            self.navigationController?.navigationBar.isTranslucent = false
        }
    }
}
`
© www.soinside.com 2019 - 2024. All rights reserved.