首页 > 解决方案 > 如何跨 iOS 版本设置 UISearchController?

问题描述

我在 aUISearchController上方有一个,从 a在 a 上UITableView弹出。UIButtonUIViewController

一切都好。然后 iOS 11.0 来了,需要不同的设置。然后 iOS 13.0 出来了,UISearchBar在 UI 中是不可见的。我添加了一个特殊情况:搜索栏现在可见。但是搜索栏的底部和表格的顶部之间有一个间隙。用户可以向上滚动表格行以填补这个空白,然后向下滚动以显示空白。

我怎样才能摆脱这个差距?

代码:

        if #available(iOS 13.0, *) {
            // my attempt at getting a correct setup
            self.navigationItem?.searchController = searchController
            table.tableHeaderView = searchController?.searchBar
        } else if #available(iOS 11.0, *) {
            self.navigationItem = navigationItem
        } else {
            table.tableHeaderView = searchController?.searchBar
        }

标签: swiftuitableviewios13uisearchcontroller

解决方案


可行的解决方案归结为使searchController第一响应者的时间问题。

问题中的代码可以简化为:

if #available(iOS 11.0, *) {
    self.navigationItem = navigationItem
} else {
    table.tableHeaderView = searchController?.searchBar
}

因为不需要 iOS 13 的特殊情况。

我有一个显示搜索控制器和结果的功能,这是:

// be the last claiming firstResponder otherwise,
// keyboard doesn't appear and searchBar doesn't move into navbar
DispatchQueue.main.async {
    self.searchController?.searchBar.becomeFirstResponder()
}

async对我来说很有意义,因为在尝试将焦点设置在searchBar.

对于 iOS 13(此更改仍与 iOS 11+ 兼容)我已切换到asyncAfter

DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) {
    self.searchController?.searchBar.becomeFirstResponder()
}

这让我很紧张,因为我不知道为什么代码需要等待 0.01 秒才能调用becomerFirstResponder(). 这是我这部分代码中的唯一async调用。

如果有人知道为什么请回答,那将是真正的正确答案!:)


推荐阅读