效果图1

效果图2

其实一般是在第一种情况使用的UISearchController,但是第二种情况这种又懒得去用uisearchbar+uitableview等等去处理,

其实主要是对数据源的合理使用即可

UISearchController通常是用来排查数据的,比如当前的uitableviewcontroller有许多数据,排查之后需要更新显示数据。

首先UISearchController是联通主cntroller与结果controller桥梁

在主controller建立UISearchController对象

@interface UIViewControllerLocation ()
{
UISearchController* searchController0;
}

那么如何联通主controller

CGRect rectBar=CGRectMake(0, 0, self.view.frame.size.width, 44);

[searchController0.searchBar setFrame:rectBar];

[self.searchBar addSubview:searchController0.searchBar];

以上代码需要理解的是searchController0.searchBar是一个只读属性,所以不能被assign,

self.searchBar是一个view

/**
* 搜索框
*/
@property (weak, nonatomic) IBOutlet UIView *searchBar;
不能够直接使用(UISearchBar)self.searchBar=searchController0.searchBar;只有tableview.tableHeaderView=searchController0.searchBar才有效果,同样是view不知道为什么
还有比较重要的一点就是,即使模拟器可以正常的显示,但是真机却无法显示searchBar(xcode7+iphone5s+ios8.3)
最终调试得出真机运行时searchController0.searchBar的frame是(0 0,0 0)需要重置frame才可以正常显示

那么如何联通结果controller

@interface UIViewControllerLocation ()
{
SearchResult* searchResult;
}
    searchResult=[SearchResult new];
searchController0=[[UISearchController alloc] initWithSearchResultsController:searchResult];
SearchResult是一个uitableviewcontroller
然后是主controller作为了结果controller的数据更新者
    searchController0.searchResultsUpdater=self;

需要遵循一个代理

@interface UIViewControllerLocation : UIViewController<UISearchResultsUpdating>

然后

     //设置活跃性为YES否则需要自行推送结果controller
searchController0.active=YES;

那么主controller如何推送数据到 结果 controller

代理

/**
* 当搜索框开始改变时触发
*
* @param searchController
*/
-(void)updateSearchResultsForSearchController:(nonnull UISearchController *)searchController
{
searchResult.getResult(@[@,@,@,@,@,@]);
}

结果controller需要处理接受到的数据(使用的block)

#import <UIKit/UIKit.h>
#import "NSObjectDataSource.h"
/**
* 获取数据
*
* @param idData
*/
typedef void (^GetResult)(id idData);
@interface SearchResult : UIViewController
/**
* 获取数据的block
*/
@property(nonatomic,copy)GetResult getResult;
/**
* 查询数据列表
*/
@property (weak, nonatomic) IBOutlet UITableView *tabelview;
/**
* tableview的datasource代理
*/
@property(nonatomic,retain)NSObjectDataSource* dataSource;
@end

主controller里初始化结果controller的获取数据block

    SearchResult*__weak weakSearchResult=searchResult;
searchResult.getResult=^(NSArray* array)
{
weakSearchResult.dataSource.nsArrayModels=array;
[weakSearchResult.tabelview reloadData];
};

在主controller里搜索更新时执行就可以了(只传递最终数据,数据的筛选需要自行处理)

 

UISearchController(使用)的更多相关文章

  1. UISearchController 的用法[点击搜索框,自动到顶部]

    //在ViewDidLoad里面如下代码 self.searchViewController = [[UISearchController alloc]initWithSearchResultsCon ...

  2. iOS UISearchController的使用

    在iOS9中,UISearchDisplayController 已经被UISearchController替代.搜索框是一种常用的控件. 假设我们要满足下图的需求,产生100个“数字+三个随机字母” ...

  3. iOS之搜索框UISearchController的使用(iOS8.0以后替代UISearchBar+display)

    在iOS 8.0以上版本中, 我们可以使用UISearchController来非常方便地在UITableView中添加搜索框. 而在之前版本中, 我们还是必须使用UISearchBar + UISe ...

  4. UISearchController使用

    iOS8之前我们使用UISearchDisplayController做TableView的本地搜索 iOS8提供实现搜索功能的SDK:UISearchController(iOS8.0之后).UIS ...

  5. UItableview 添加 uisearchController

    @property (nonatomic, strong) UISearchController* searchController; self.searchController = [[UISear ...

  6. UISearchController

    搜索框UISearchController的使用(iOS8.0以后替代UISearchBar + UIS) 1.在iOS 8.0以上版本中, 我们可以使用UISearchController来非常方便 ...

  7. UITableView与UISearchController搜索及上拉加载,下拉刷新

    #import "ViewController.h" #import "TuanGouModel.h" #import "TuanGouTableVi ...

  8. iOS原生的搜索:UISearchController

    iOS8之前我们使用UISearchDisplayController做TableView的本地搜索,查看UIKit库,苹果已经使用新控件取代它. NS_CLASS_DEPRECATED_IOS(3_ ...

  9. UISearchController Attempting to load the view of a view controller while it is deallocating is not allowed and may result in undefined behavior

    Attempting to load the view of a view controller while it is deallocating is not allowed and may res ...

  10. iOS8以后 UISearchController的用法

    查了不少资料,都不太全,自己查看了apple文档,写了一份代码: 如下(只是界面): 1. 声明属性 @property (nonatomic, strong) UISearchController ...

随机推荐

  1. 在rails 中使用mysql 出现Mysql::Error: Incorrect string value: 的问题

    这是因为你在做数据库的操作中有非英文的问题,之后gem mysql2 处理中文必须要数据库也指定是utf-8 才比较好处理 解决的方法很简单,将数据库每张表都转化成utf-8即可,如果数据库没有什么重 ...

  2. [Silverlight]调用外部可执行程序

    public void InvokeExternalExecutableApp() { if (Application.Current.HasElevatedPermissions) {using ( ...

  3. C/C++中 static 的作用

    在C中,有三个作用: 1.修饰全局变量: 作用是隐藏,也就是这个全局变量仅在本文件中可见. 2.修饰局部变量: 作用是扩展变量的生存期,令这个局部变量成为静态的. 3.修饰函数: 作用是隐藏,将此函数 ...

  4. 谷歌添加百度翻译提示Google已将百度翻译标记为恶意程序并阻止安装,怎么办

    进入谷歌浏览器的设置, 显示高级设置——隐私设置下七个选项中的第四个选项(启用针对网上诱骗和恶意软件的防护功能)把勾去掉,然后将百度翻译的CRX拖动到chrome的安装插件页面, 修改chrome的限 ...

  5. python 在windows下监听键盘按键

    python 在windows下监听键盘按键 使用到的库 ctypes(通过ctypes来调用Win32API, 主要就是调用钩子函数) 使用的Win32API SetWindowsHookEx(), ...

  6. MongoDB 搭建Node.js开发环境

    理解Mongoose Elegant MongoDB object modeling for Node.js   安装Mongoose   $ cnpm install --save mongoose ...

  7. Ajax实现跨域访问的三种方法

    转载自:http://www.jb51.net/article/68424.htm 一.什么是跨域 我们先回顾一下域名地址的组成: http:// www . google : 8080 / scri ...

  8. wait/notify

    某面试题,实现一个生产者——消费者模型 题目:采用多线程技术,通过wait/notify,设计实现一个符合生产者和消费者问题的程序,对某一个对象(枪膛)进行操作,其最大容量是20颗子弹,生产者线程是一 ...

  9. intellijidea课程 intellijidea神器使用技巧1-5 idea界面介绍

    菜单栏介绍: file:文件操作edit:文本操作view:视图操作navigate:跳转code:源码文件analyze:项目依赖关系分析refactor:代码重构快捷操作,如:抽取函数build: ...

  10. TeeChart for .NET常用属性总结

    本文总结了图表控件Teechart for .NET常用的一些属性,对图表开发人员来说是一个很好的参考. 原文链接:http://blog.csdn.net/u010270772/article/de ...