内置刷新
内置刷新是苹果IOS6以后才推出的一个API,主要是针对TableViewController增加了一个属性,refreshControl,所以如果想用这个内置下拉刷新的话,最好给你的TableView指定一个专门的视图控制器了。
使用的话,我们需要给refreshControl指定一个UIRefreshControl对象。跟进到头文件中看到
三个属性,算上初始化三个方法,并不难,然后配置refreshControl
附上代码
  1. /******内置刷新的常用属性设置******/
  2. UIRefreshControl *refresh = [[UIRefreshControl alloc] init];
  3. refresh.attributedTitle = [[NSAttributedString alloc] initWithString:@"下拉刷新"];
  4. refresh.tintColor = [UIColor blueColor];
  5. [refresh addTarget:self action:@selector(pullToRefresh) forControlEvents:UIControlEventValueChanged];
  6. self.refreshControl = refresh;
设置了一个监听方法,来简单看下其实现
附上代码
  1. //下拉刷新
  2. - (void)pullToRefresh
  3. {
  4. //模拟网络访问
  5. [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
  6. self.refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:@"刷新中"];
  7. double delayInSeconds = 1.5;
  8. dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
  9. dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
  10. _rowCount += 5;
  11. [self.tableView reloadData];
  12. //刷新结束时刷新控件的设置
  13. [self.refreshControl endRefreshing];
  14. self.refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:@"下拉刷新"];
  15. [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
  16. _bottomRefresh.frame = CGRectMake(0, 44+_rowCount*RCellHeight, 320, RCellHeight);
  17. });
  18. }
因为这里并不是真正进行网络访问,所以这里用到了一个模拟网络访问延时的方法 dispatch_after 关于这个GCD方法并不难,只要设置延时时间和延时结束Block中的代码即可。
可能注意到有个_bottomRefresh, 这个下面会用到,是一个底部“查看更多"的一个控件。
先来看下现在的效果
方法执行结束后我们会发现在TableView中Cell多了5行,这是刚才设置的_rowCount+5并刷新tableView产生的效果。
自定义刷新
在有些时候我们会看到TableView的最下方有一个标题为“查看更多"的按钮,有的可以响应向下滚动并且自动刷新,有的需要点击一下才会刷新,这里介绍一下点击响应刷新的一个实现方法。
先看下效果
我这里就使用了一个按钮,初始化到表视图的底部。
附上代码
  1. /******自定义查看更多属性设置******/
  2. _bottomRefresh = [UIButton buttonWithType:UIButtonTypeCustom];
  3. [_bottomRefresh setTitle:@"查看更多" forState:UIControlStateNormal];
  4. [_bottomRefresh setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
  5. [_bottomRefresh setContentEdgeInsets:UIEdgeInsetsMake(15, 0, 0, 0)];
  6. [_bottomRefresh addTarget:self action:@selector(upToRefresh) forControlEvents:UIControlEventTouchUpInside];
  7. _bottomRefresh.frame = CGRectMake(0, 44+_rowCount*RCellHeight, 320, RCellHeight);
  8. [self.tableView addSubview:_bottomRefresh];
由于默认的Button的标题稍微有点靠近最后一个Cell,所以设置了一下contentEdgeInsets属性。
响应事件
附上代码
  1. //上拉加载
  2. - (void)upToRefresh
  3. {
  4. _bottomRefresh.enabled = NO;
  5. [SVProgressHUD showWithStatus:@"加载中..."];
  6. [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
  7. double delayInSeconds = 1.5;
  8. dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
  9. dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
  10. _rowCount += 5;
  11. [self.tableView reloadData];
  12. [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
  13. [SVProgressHUD showSuccessWithStatus:@"加载完成"];
  14. _bottomRefresh.frame = CGRectMake(0, 44+_rowCount*RCellHeight, 320, RCellHeight);
  15. _bottomRefresh.enabled = YES;
  16. });
  17. }
原理同上面下拉刷新的方法比较接近,这里为了显示加载网络效果,使用了一个第三方框架SVProgressHUD,关于HUD的具体使用就不介绍了,直接跟进头文件看方法就可知道。HUD还有许多开源框架,比如MBProgressHUD等。
看下效果
EGO刷新框架
EGORefreshHeaderView刷新中,我们可以在初始化的时候设置两种样式,头部样式以及尾部尾部。设置代理,实现委托方法即可。
这里只介绍头部刷新
附上代码
  1. /******头部的下拉刷新******/
  2. _headerRefreshView = [[EGORefreshTableHeaderView alloc] initWithFrame:CGRectMake(0, 0 - self.tableView.frame.size.height, 320, self.tableView.frame.size.height) withType:EGORefreshHeader];
  3. _headerRefreshView.delegate = self;
  4. [self.tableView addSubview:_headerRefreshView];
效果
看下代理方法
附上代码
  1. #pragma mark -
  2. #pragma mark EGORefresh Delegate
  3. - (BOOL)egoRefreshTableDataSourceIsLoading:(UIView *)view
  4. {
  5. return _isRefreshing;
  6. }
  7. - (NSDate *)egoRefreshTableDataSourceLastUpdated:(UIView *)view
  8. {
  9. return [NSDate date];
  10. }
  11. - (void)egoRefreshTableDidTriggerRefresh:(UIView*)view{
  12. [self reloadTableViewDataSource];
  13. double delayInSeconds = 1.5;
  14. dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
  15. dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
  16. [self performSelector:@selector(doneLoadingTableViewData)];
  17. });
  18. }
三个代理方法分别是返回刷新状态,返回刷新后显示的时间,以及刷新调用的方法。两个方法具体为
附上代码
  1. - (void)reloadTableViewDataSource
  2. {
  3. _rowCount += 5;
  4. _isRefreshing = YES;
  5. }
  6. - (void)doneLoadingTableViewData
  7. {
  8. // model should call this when its done loading
  9. _isRefreshing = NO;
  10. [self.tableView reloadData];
  11. [_headerRefreshView egoRefreshScrollViewDataSourceDidFinishedLoading:self.tableView];
  12. //header
  13. _headerRefreshView.frame = CGRectMake(0, 0-self.tableView.bounds.size.height- 44, self.tableView.frame.size.width, self.tableView.bounds.size.height + 44);
  14. }
要实现刷新效果,最后我们还要实现两个ScrollView的代理方法交给其处理
附上代码
  1. - (void)scrollViewDidScroll:(UIScrollView *)scrollView
  2. {
  3. [_headerRefreshView egoRefreshScrollViewDidScroll:scrollView];
  4. }
  5. - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
  6. {
  7. [_headerRefreshView egoRefreshScrollViewDidEndDragging:scrollView];
  8. }
效果就不贴图了,也是刷新后新增5个Cell
搜索显示视图控制器的使用
在这个项目的demo中,我是使用storyboard拉到了tableview中,所以很多属性自动配置好,不需要手工实现了。不过由于 searchDisplayController有一个内置的搜索显示表视图,所以在对其进行管理上,需要视图控制器每次调用TableView代理方法 时需要进行一下比较。
附上代码
  1. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
  2. {
  3. if (tableView == self.searchDisplayController.searchResultsTableView)
  4. {
  5. return _searchList.count;
  6. }
  7. else
  8. {
  9. return _rowCount;
  10. }
  11. }
同样cell也需要设置。那么这个_searchList的数据从哪里获得呢,通过实现UISearchDisplayController的代理方法即可
附上代码
  1. - (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
  2. {
  3. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self CONTAINS %@", searchString];
  4. if (_searchList)
  5. {
  6. _searchList = nil;
  7. }
  8. _searchList = [NSMutableArray arrayWithArray:[_dataList filteredArrayUsingPredicate:predicate]];
  9. return YES;
  10. }
这里用到了一个谓词(NSPredicate)类,谓词类似于苹果内置的SQL语句,对可以进行一些查询筛选等等。
来看下搜索框使用的效果。

响应表视图点击的方法也需要判断,然后根据需求实现

IOS详解TableView——内置刷新,EGO,以及搜索显示控制器的更多相关文章

  1. IOS详解TableView——选项抽屉(天猫商品列表)

    在之前的有篇文章讲述了利用HeaderView来写类似QQ好友列表的表视图. 这里写的天猫抽屉其实也可以用该方法实现,具体到细节每个人也有所不同.这里采用的是点击cell对cell进行运动处理以展开“ ...

  2. IOS详解TableView——对话聊天布局的实现

    上篇博客介绍了如何使用UITableView实现类似QQ的好友界面布局.这篇讲述如何利用自定义单元格来实现聊天界面的布局. 借助单元格实现聊天布局难度不大,主要要解决的问题有两个: 1.自己和其他人说 ...

  3. iOS:详解MJRefresh刷新加载更多数据的第三方库

    原文链接:http://www.ios122.com/2015/08/mjrefresh/ 简介 MJRefresh这个第三方库是李明杰老师的杰作,这个框架帮助我们程序员减轻了超级多的麻烦,节约了开发 ...

  4. 详解DevExpress.LookUpEdit控件实现自动搜索定位功能(转)

    转载自csdn博客 爱拼才会赢 的博客 地址是详解DevExpress.LookUpEdit控件实现自动搜索定位功能(转)

  5. 详解Linux内核红黑树算法的实现

    转自:https://blog.csdn.net/npy_lp/article/details/7420689 内核源码:linux-2.6.38.8.tar.bz2 关于二叉查找树的概念请参考博文& ...

  6. 干货:Java多线程详解(内附源码)

      线程是程序执行的最小单元,多线程是指程序同一时间可以有多个执行单元运行(这个与你的CPU核心有关). 在java中开启一个新线程非常简单,创建一个Thread对象,然后调用它的start方法,一个 ...

  7. IOS系统唤醒微信内置地图

    针对前一篇文章 唤醒微信内置地图 后来发现在IOS系统中运行 唤醒地图会无效的问题.因为在IOS上无法解析这俩个字符串的问题! 需要对经纬度 使用 “parseFloat()”进行转换 返回一个浮点数 ...

  8. iOS 详解NSXMLParser方法解析XML数据方法

    前一篇文章已经介绍了如何通过URL从网络上获取xml数据.下面介绍如何将获取到的数据进行解析. 下面先看看xml的数据格式吧! <?xml version="1.0" enc ...

  9. Vue实战041:获取当前客户端IP地址详解(内网和外网)

    前言 我们经常会有需求,希望能获取的到当前用户的IP地址,而IP又分为公网ip(也称外网)和私网IP(也称内网IP),IP地址是IP协议提供的一种统一的地址格式,每台设备都设定了一个唯一的IP地址”, ...

随机推荐

  1. 使用MyBatis Generator生成DAO

    虽然MyBatis很方便,但是想要手写全部的mapper还是很累人的,好在MyBatis官方推出了自动化工具,可以根据数据库和定义好的配置直接生成DAO层及以下的全部代码,非常方便. 需要注意的是,虽 ...

  2. PLSQL Developer的使用

    登陆服务器 除了 sys 用户登陆之外,其他都都选Normal 新建sql 窗口 编写执行sql语句 设置字体.颜色 工具——首选项——用户界面——字体——选择 工具——首选项——用户界面——编辑器— ...

  3. 【iCore3 双核心板】例程二十二:LAN_UDP实验——以太网数据传输

    实验指导书及代码包下载: http://pan.baidu.com/s/1kTPlJMJ iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  4. 【iCore3 双核心板_ uC/OS-III】例程六:信号量——共享资源

    实验指导书及代码包下载: http://pan.baidu.com/s/1milKoVA iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  5. iOS审核秘籍】提审资源检查大法

    iOS审核秘籍]提审资源检查大法 2015/11/27 阅读(752) 评论(1) 收藏(6) 加入人人都是产品经理[起点学院]产品经理实战训练营,BAT产品总监手把手带你学产品点此查看详情! 本篇主 ...

  6. iOS 3D touch 使用技巧

    第一个 在桌面中3d Touch 打开菜单 由于本人纯属代码党,本次实现方法也只使用代码实现 到达到这个效果并不难,只需要在appdelegate中实现以下代码即可 ,当然也有缺点,就是这个app没运 ...

  7. phpcms 导航栏点击栏目颜色定位方法和phpcms list页实现分页

    另:一个栏目下面如果没有子栏目,那么它调用的模板就是列表页模板(及list_为前缀的模板):如果一个栏目下面有子栏目,那么它调用的就是栏目首页模板(category_为前缀的模板). 当你这个栏目添加 ...

  8. sql操作之修改记录值

    mysql修改.删除数据记录 用update修改记录 UPDATE tbl_name SET 要更改的列 WHERE 要更新的记录 这里的 WHERE 子句是可选的,因此如果不指定的话,表中的每个记录 ...

  9. iOS,plist文件、pct文件,工程设置

    1.使用pch文件 2.在info.plist中配置URL Schemes 3.plist配置拍照界面,复制,粘贴等菜单的显示语言 显示中文 4.使用非ARC库/ARC库 5.链接选项-Objc &a ...

  10. mongodb的一些基本操作

    1.列出所有数据库 >show dbs   2.使用数据库 >use memo   3.列出当前数据库的collections >show collections   4.显示当前正 ...