zoukankan      html  css  js  c++  java
  • iOS UISearchController 的使用方法

    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

  • 相关阅读:
    owncloud7.0.2.1升级8.0.3
    iptables删除规则
    ESXi Install OpenWRT
    Eclipse连接VirtualBox中的Android x86
    win7、linux安装使用pip、mitmproxy
    linux php bom
    ios项目上传svn丢失*.a文件
    升级owncloud到7.0.2
    phpinfo有mysqlnd没有mysql
    Cacti监控Centos抓包unreachable
  • 原文地址:https://www.cnblogs.com/silence-cnblogs/p/6405545.html
Copyright © 2011-2022 走看看