iOS 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

转载请注明出处:http://www.cnblogs.com/silence-cnblogs/p/6405545.html

iOS UISearchController 的使用方法的更多相关文章

  1. iOS-提高iOS开发效率的方法和工具

    提高iOS开发效率的方法和工具 介绍 这篇文章主要是介绍一下我在iOS开发中使用到的一些可以提升开发效率的方法和工具. IDE 首先要说的肯定是IDE了,说到IDE,Xcode不能跑,当然你也可能同时 ...

  2. iOS中的过期方法和新的替代方法

    关于iOS中的过期方法和新的替代方法 1.获取某些类的UINavigationBar的统一外观并设置UINavigationbar的背景 注:方法名改了但是基本使用方法不变 + (instancety ...

  3. opencv直线检测在c#、Android和ios下的实现方法

    opencv直线检测在c#.Android和ios下的实现方法 本文为作者原创,未经允许,不得转载 :原文由作者发表在博客园:http://www.cnblogs.com/panxiaochun/p/ ...

  4. iOS开发——实用篇&提高iOS开发效率的方法和工具

    提高iOS开发效率的方法和工具 介绍 这篇文章主要是介绍一下我在iOS开发中使用到的一些可以提升开发效率的方法和工具. IDE 首先要说的肯定是IDE了,说到IDE,Xcode不能跑,当然你也可能同时 ...

  5. iOS与HTML5交互方法总结(转)

    今天小编在找技术文章的时候,发现这样一个标题:iOS与HTML5交互方法总结,怎么看着这么熟悉呢?   还以为是刚哥用了别的文章,点进去一看,原来是刚哥自己写的文章,他们转载的,而且还上了Dev St ...

  6. IOS常见的加密方法,常用的MD5和Base64

    iOS代码加密常用加密方式 iOS代码加密常用加密方式,常见的iOS代码加密常用加密方式算法包括MD5加密.AES加密.BASE64加密,三大算法iOS代码加密是如何进行加密的,且看下文 MD5 iO ...

  7. iOS与HTML5交互方法总结(修正)

    摘要 看了不少别人写的博客或者论坛,关于iOS与HTML5交互方法大概主要有5种方式: 1. 利用WKWebView进行交互(系统API) 2. 利用UIWebView进行交互(系统API) 3. 苹 ...

  8. UIView封装动画--iOS利用系统提供方法来做转场动画

    UIView封装动画--iOS利用系统提供方法来做转场动画 UIViewAnimationOptions option; if (isNext) { option=UIViewAnimationOpt ...

  9. UIView封装动画--iOS利用系统提供方法来做关键帧动画

    iOS利用系统提供方法来做关键帧动画 ios7以后才有用. /*关键帧动画 options:UIViewKeyframeAnimationOptions类型 */ [UIView animateKey ...

随机推荐

  1. FZU 2099 魔法阵

    手算. #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> u ...

  2. TimeDelta.total_seconds() in Python2.6-

    Python 的日期操作真是无力吐槽. 如果在做日期相加减时使用TimeDelta对象,2.7及以后的TimeDelta有total_seconds()方法获取总秒数,而2.6之前没有该方法,且众所周 ...

  3. BZOJ 1257 [CQOI2007]余数之和sum ——Dirichlet积

    [题目分析] 卷积很好玩啊. [代码] #include <cstdio> #include <cstring> #include <cmath> #include ...

  4. stm单片机之STM32F4-Discovery资料汇总 (转载自http://blog.163.com/thinki_cao/blog/static/83944875201362493134992/)

    STM32F4的资料大部分都在这里: http://www.stmcu.org/download/index.php?act=ziliao&id=150 根据个人的理解对这些资料作了一些规律, ...

  5. 无锁同步-JAVA之Volatile、Atomic和CAS

    1.概要 本文是无锁同步系列文章的第二篇,主要探讨JAVA中的原子操作,以及如何进行无锁同步. 关于JAVA中的原子操作,我们很容易想到的是Volatile变量.java.util.concurren ...

  6. hack:选择符前缀法,样式属性前缀法

    选择符前缀法 <style> *html .test{width:100px;} /*only for IE6*/ *+html .test{width:100px;}/*for IE6 ...

  7. LDA 线性判别分析

    LDA, Linear Discriminant Analysis,线性判别分析.注意与LDA(Latent Dirichlet Allocation,主题生成模型)的区别. 1.引入 上文介绍的PC ...

  8. Hibernate的一些事儿

    一.Hibernate的工作原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3.打开Sesssion 4.创建事务Transation 5.持久化操作 6.提 ...

  9. UIButton 之 按下高亮

    设置高亮 [btn setHighlighted:YES]; 设置按下时高亮 [btn setShowsTouchWhenHighlighted:YES];

  10. IOS设计模式--代理 (委托)

    原文 http://blog.csdn.net/lovefqing/article/details/8270111 委托(delegate)也叫代理是iOS开发中常用的设计模式.我们借助于protoc ...