将 UISearchController 设置为始终处于活动状态

问题描述

我正在尝试在“设置”>“通用”>“iPhone 存储”>“搜索”中重新创建搜索屏幕。这是一个模态呈现的屏幕,导航栏中的 UISearchController 始终处于活动状态,键盘在屏幕出现后出现,点击“取消”会关闭屏幕而不是停用搜索模式。

我遇到的问题是在 viewDidAppear 之前我无法使搜索控制器处于活动状态,因此您可以在整个演示文稿中看到导航栏,然后搜索栏出现后向上移动到导航栏中.希望始终处于活动状态,但在 isActive = true 中设置 viewDidLoad 没有任何作用。我也尝试过 searchController.searchBar.becomeFirstResponder(),但即使在 viewDidAppear 中也不起作用 - 必须通过 dispatchQueue.main.asyc 延迟。

有人指出 here 他们认为这是因为搜索界面尚未完全初始化或其他原因。我们如何像上面提到的设置屏幕那样创建一个始终处于活动状态的搜索控制器?

override func viewDidLoad() {
    super.viewDidLoad()
    
    searchController.delegate = self
    searchController.searchResultsUpdater = self
    searchController.obscuresBackgroundDuringPresentation = false
    searchController.searchBar.delegate = self
    navigationItem.searchController = searchController
    definesPresentationContext = true
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    
    //FIXME: Works,but delay is undesirable - search controller should be active initially
    searchController.isActive = true

    //OR
    dispatchQueue.main.async {
        self.searchController.searchBar.becomeFirstResponder()
    }
}

解决方法

vieDidLoadviewWillAppear

试试这个
    DispatchQueue.main.async {
        UIView.performWithoutAnimation {
            self.searchController.isActive = true
        }
    }

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...