swift - 如何跨 iOS 版本设置 UISearchController?
问题描述
我在 aUISearchController
上方有一个,从 a在 a 上UITableView
弹出。UIButton
UIViewController
一切都好。然后 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
}
解决方案
可行的解决方案归结为使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
调用。
如果有人知道为什么请回答,那将是真正的正确答案!:)
推荐阅读
- php - php按钮会话检查并允许访问
- django - django_select2 小部件 - “未找到结果”
- scala - 如何根据模式动态生成数据集?
- javascript - Mongo in node.js 在 $in 或类似的东西中添加 $gte/$lt
- javascript - 在 wordpress 上升级 ACF 后,onchange 函数 Javascript 停止工作
- sql - 删除所有不喜欢所需值的字符
- javascript - 以 GZIP/ZIP 格式对 XML 的 AJAX 请求 - 如何在 Javascript 中解压缩数据
- c# - 更改为 64 位后用户范围的设置丢失
- python - 无法使用python在redis中使用ZADD(排序集)插入数据
- php - Xampp Mysql 未运行 MySQL 意外关闭