【问题标题】:Set UISearchController to be always active将 UISearchController 设置为始终处于活动状态
【发布时间】:2021-05-10 22:42:20
【问题描述】:

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

我遇到的问题是直到viewDidAppear 才能激活搜索控制器,因此您可以在整个演示文稿中看到导航栏,然后在搜索栏出现后向上移动到导航栏。希望始终处于活动状态,但在viewDidLoad 中设置isActive = true 不会做任何事情。我也尝试过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()
    }
}

【问题讨论】:

    标签: ios uisearchcontroller


    【解决方案1】:

    vieDidLoadviewWillAppear 试试这个

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

    【讨论】:

    • 这不起作用,这仍然导致在整个演示文稿中看到导航栏,然后在完成动画后搜索栏移动到导航栏。
    • 我明白了。因为我使用自定义过渡,所以动画不明显。我建议直接使用titleView 中的搜索栏,无需任何调整。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-28
    • 2020-07-29
    相关资源
    最近更新 更多