欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

iOS UISearchController的使用方法

程序员文章站 2024-02-15 20:00:40
uisearchcontroller 让用户在 uisearchbar 上输入搜索关键词,展示搜索结果或者进行其他操作。uisearchcontroller 把两个控制器(...

uisearchcontroller 让用户在 uisearchbar 上输入搜索关键词,展示搜索结果或者进行其他操作。uisearchcontroller 把两个控制器(uiviewcontroller)连在一起。父控制器放置 uisearchbar 控件。当用户点击搜索框时,uisearchbar 会移到屏幕顶部;输入搜索关键词,uisearchbar 下面出现子控制器的view。当然,也可以用代码使 uisearchbar 和子控制器展示出来,即便父控制器没有放置 uisearchbar。

一般用法

  1. 在父控制器中创建子控制器
  2. 用子控制器创建 uisearchcontroller,通常会把 uisearchcontroller 变成父控制器的属性
  3. 设置 uisearchcontroller 的searchresultsupdater属性
  4. 通常会在父控制器上放置 uisearchcontroller 的searchbar
  5. 把父控制器definespresentationcontext属性设置为 true

以下为父控制器代码示例

let searchresultsvc = searchresultsvc(allstrings: allstrings)
searchcontroller = uisearchcontroller(searchresultscontroller: searchresultsvc)
searchcontroller.searchresultsupdater = searchresultsvc;
let tableview = uitableview(frame: view.bounds)
tableview.datasource = self
view.addsubview(tableview)
tableview.tableheaderview = searchcontroller.searchbar;
tableview.tablefooterview = uiview()
definespresentationcontext = true;

uisearchcontroller 的searchresultsupdater属性一般设置为父控制器或子控制器。这个属性的值要符合 uisearchresultsupdating 协议,实现updatesearchresults(for searchcontroller: uisearchcontroller)方法。这个方法会在searchbar变为第一响应者(比如,当用户点击搜索框,键盘弹出),以及搜索关键词改变时调用。在这个方法中写入执行搜索、更新 ui 的代码。

以上代码将子控制器作为 uisearchcontroller 的searchresultsupdater。假设子控制器的数据源为 allstrings 和 strings,均为含 string 的 array。其中,allstrings 为常量,包含所有的 string;strings 包含符合搜索条件的 string,需要在用户输入时更新。搜索条件为,含有用户输入的内容,不区分大小写。用 uitableview 展示搜索结果。在updatesearchresults(for searchcontroller: uisearchcontroller)方法中,获取 searchbar 的text,更新 strings,更新 ui。

以下是子控制器代码示例

func updatesearchresults(for searchcontroller: uisearchcontroller) {
 strings.removeall()
 if let text = searchcontroller.searchbar.text?.uppercased(), !text.isempty {
  strings = allstrings.filter { $0.contains(text) }
 }
 tableview.reloaddata()
}

改变样式

默认情况下,用户点击搜索框,导航栏(navigation bar)隐藏,uisearchbar 上移,下面能看到父控制器,但有灰色蒙版遮挡。点击灰色蒙版,退回父控制器。把 uisearchcontroller 的hidesnavigationbarduringpresentation属性设置为false,则导航栏不隐藏。把 uisearchcontroller 的dimsbackgroundduringpresentation属性设置为false,则灰色蒙版不显示,能点击父控制器。

搜索框为空时,子控制器隐藏

如果 uisearchcontroller 的searchbar已经放置在父控制器上,用户点击搜索框时,uisearchbar 会上移至屏幕顶部,键盘弹出。此时会调用updatesearchresults(for searchcontroller: uisearchcontroller)方法,但子控制的view没有出现,ishidden为 true。输入内容后,子控制器的view才出现。清空输入的内容,子控制器的view消失。如果要在搜索框为空时也显示子控制器,在updatesearchresults(for searchcontroller: uisearchcontroller)方法中加入searchcontroller.searchresultscontroller?.view.ishidden = false即可。

代码展示 uisearchbar 和子控制器的方法

在父控制中可以用代码来展示 uisearchbar 和子控制器,具体实现方法要看 uisearchcontroller 的searchbar是否放置在父控制器上。

如果 uisearchcontroller 的searchbar放置在父控制器上

uisearchbar 上移,弹出键盘(和用户点击搜索框一样的效果)

searchcontroller.searchbar.becomefirstresponder()

uisearchbar 上移,但不弹出键盘

present(searchcontroller, animated: true, completion: nil)

或者

searchcontroller.isactive = true

如果 uisearchcontroller 的searchbar不在父控制器上

uisearchbar 从顶部出现,弹出键盘

present(searchcontroller, animated: true, completion: nil)

搜索框一出来就成为第一响应者,键盘会弹出,不知道怎么禁止键盘弹出。当然,展示搜索框却不弹出键盘,是奇怪的需求。

代码已上传github:https://github.com/silence-github/searchcontrollerdemo

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!