iOS UISearchController的使用方法
uisearchcontroller 让用户在 uisearchbar 上输入搜索关键词,展示搜索结果或者进行其他操作。uisearchcontroller 把两个控制器(uiviewcontroller)连在一起。父控制器放置 uisearchbar 控件。当用户点击搜索框时,uisearchbar 会移到屏幕顶部;输入搜索关键词,uisearchbar 下面出现子控制器的view。当然,也可以用代码使 uisearchbar 和子控制器展示出来,即便父控制器没有放置 uisearchbar。
一般用法
- 在父控制器中创建子控制器
- 用子控制器创建 uisearchcontroller,通常会把 uisearchcontroller 变成父控制器的属性
- 设置 uisearchcontroller 的searchresultsupdater属性
- 通常会在父控制器上放置 uisearchcontroller 的searchbar
- 把父控制器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
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!