当前位置: 移动技术网 > IT编程>移动开发>IOS > iOS UISearchController的使用方法

iOS UISearchController的使用方法

2019年07月24日  | 移动技术网IT编程  | 我要评论

黑疯婆子闹监狱,神舟五号发射时间,摩托车改装论坛

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

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网