如何跨 iOS 版本设置 UISearchController?
Posted
技术标签:
【中文标题】如何跨 iOS 版本设置 UISearchController?【英文标题】:How to set-up UISearchController across iOS versions? 【发布时间】:2019-11-13 16:07:19 【问题描述】:我在UITableView
上方有一个UISearchController
,从UIViewController
上的UIButton
弹出。
一切都很好。然后 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
【问题讨论】:
嗨,Carl,请查看此链接 - ***.com/questions/57521967/…,如果有帮助请告诉我。 嗨@Sam 我看到了那个帖子。在没有解决我的问题的情况下尝试了投票的答案。在这一点上,我想了解 Apple 打算如何设置工作,而不是围绕 Apple 的 API 进行破解。 【参考方案1】:工作解决方案归结为让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
上之前需要完成 UI。
对于 iOS 13(并且此更改仍与 iOS 11+ 兼容)我已切换到 asyncAfter
DispatchQueue.main.asyncAfter(deadline: .now() + 0.01)
self.searchController?.searchBar.becomeFirstResponder()
这让我很紧张,因为我不知道为什么代码需要等待 0.01 秒才能调用 becomerFirstResponder()
。这是我这部分代码中唯一的 async
调用。
如果有人知道为什么请回答,这将是真正的正确答案! :)
【讨论】:
以上是关于如何跨 iOS 版本设置 UISearchController?的主要内容,如果未能解决你的问题,请参考以下文章