如何跨 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?的主要内容,如果未能解决你的问题,请参考以下文章

如何解决前端访问跨域问题

如何跨包引用Android“资产”?

如何设置最低要求的 iOS 版本?

如何在 iPhone iOS 的设置中查看 Safari 版本?

谷歌浏览器设置跨域失败

iOS - 跨视图控制器保持背景动画