UITableview 上提刷新

摘要:
通知表视图控制器是否加载更多data://Footview.m1//Call此方法通过在屏幕上不断拖动手指2-(void)RefreshScrollViewDidSoll:7offset=MIN(offset;//提升表数据;//获取是否从表视图加载更多数据;

最近做的项目中用到了列表,数据是要从webservice请求,网络是通过3G或者Wifi来连接,所以决定采用分页加载方式下载数据。

从网上找到的资料,基本思路就是在Tableview的末尾,也就是contentview(Tableview本身继承与Scrollview)的末尾,加一个footview,用来显示:“上拉加载更多数据”、“加载中“、"松开即加载数据"。

这里个人认为比较重要的思想就是tableview与footview之间的交互。分以下三个步骤吧:

1.tableview需要通知footview的事情包括滑动,还有滑动结束。

2.footview对于滑动的相应:询问tableview是否正在加载更多数据,更新显示的标题。

3.footview对于滑动结束的相应:通知tableview的控制器是否加载更多数据。

4.tableview加载更多数据去,加载完毕再回头通知footview

不知这样说能否明白,我暂时是这么理解的。下面根据1-3步骤来说下代码。

要实现步骤1:

/*TableViewController.m*/
//UIScrollViewDeleagete Methods
1 - (void)scrollViewDidScroll:(UIScrollView *)scrollView
2 {        
3     [footview RefreshScrollViewDidScroll:scrollView];//只要滑动就会触发,这时候要通知footview
4 }
5 
6 - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
7 {
8     [footview RefreshScrollViewDidEndDragging:scrollView];//滑动结束,通知footview    
9 }
//这段代码是tableview的控制器中,要实现通知footview滑动消息的两个委托方法。

footview得知滑动消息后,要作出反应。

实现步骤2:

//Footview.m
 1 //手指屏幕上不断拖动调用此方法
 2 - (void)RefreshScrollViewDidScroll:(UIScrollView *)scrollView {    
 3     
 4     if (_state == PullRefreshLoading) {//footview显示“正在加载”状态
 5         
 6         CGFloat offset = MAX(scrollView.contentOffset.y * -1, 0);
 7         offset = MIN(offset, 60);
 8         scrollView.contentInset = UIEdgeInsetsMake(0.0, 0.0f, RefreshViewHight, 0.0f);//将表格数据提上去,为footview腾出空间
 9         
10     } else if (scrollView.isDragging) {//拖动,但是没有松开,这个时候需要根据拖动的距离显示"上拉加载更多数据"或者“松开即可加载更多”
11         
12         BOOL _loading = NO;
13         if ([_delegate respondsToSelector:@selector(egoRefreshTableHeaderDataSourceIsLoading:)]) {
14             _loading = [_delegate RefreshTableHeaderDataSourceIsLoading:self];//从tableview获取是不是正在加载更多数据,如果是的话,那么footview将不做出反应,也就是说,保证每次只加载一次数据
15         }
16         
17         if (_state == EGOOPullRefreshPulling && scrollView.contentOffset.y + (scrollView.frame.size.height) < scrollView.contentSize.height + RefreshViewHight && scrollView.contentOffset.y > 0.0f && !_loading) {
18             [self setState:PullRefreshNormal];//footview显示"上拉将加载更多"
19         } else if (_state == EGOOPullRefreshNormal && scrollView.contentOffset.y + (scrollView.frame.size.height) > scrollView.contentSize.height + RefreshViewHight  && !_loading) {
20             [self setState:PullRefreshPulling];//footview显示"松开即加载更多"
21         }
22         
23         if (scrollView.contentInset.bottom != 0) {//将表格恢复,将看不到footview
24             scrollView.contentInset = UIEdgeInsetsZero;
25         }
26         
27     }
28     
29 }
步骤3.

32 //当用户停止拖动,并且手指从屏幕中拿开的的时候调用此方法
33 - (void)RefreshScrollViewDidEndDragging:(UIScrollView *)scrollView {
34     
35     BOOL _loading = NO;
36     if ([_delegate respondsToSelector:@selector(RefreshTableHeaderDataSourceIsLoading:)]) {
37         _loading = [_delegate RefreshTableHeaderDataSourceIsLoading:self];//询问tableview是否正在加载数据
38     }
39     //如果拖动的距离大于footview的高度,并且没有正在加载数据
40     if (scrollView.contentOffset.y + (scrollView.frame.size.height) > scrollView.contentSize.height + RefreshViewHight && !_loading) {
41         
42         if ([_delegate respondsToSelector:@selector(egoRefreshTableHeaderDidTriggerRefresh:)]) {
43             [_delegate RefreshTableHeaderDidTriggerRefresh:self];//通知tableview去加载更多数据
44         }
45         
46         [self setState:PullRefreshLoading];//footview状态更改为”正在加载“
47         [UIView beginAnimations:nil context:NULL];
48         [UIView setAnimationDuration:0.2];
49         scrollView.contentInset = UIEdgeInsetsMake(0.0f, 0.0f, RefreshViewHight, 0.0f);
50         [UIView commitAnimations];
51         
52     }
53 }   
步骤4.

//tableview.m 实现的footview要求的协议方法
 1 - (void)RefreshTableHeaderDidTriggerRefresh:(RefreshTableHeaderView*)view{
 2     
 3     [self reloadTableViewDataSource];//加载数据
 4     [self performSelector:@selector(doneLoadingTableViewData) withObject:nil afterDelay:4.0];//加载完毕
 5     
 6 }
 7 
 8 - (BOOL)RefreshTableHeaderDataSourceIsLoading:(RefreshTableHeaderView*)view{
 9     
10     return _reloading; // should return if data source model is reloading
11     
12 }
 1 - (void)reloadTableViewDataSource{
 2     
 3     //  在这里加载更多数据
 4     //  put here just for demo
 5     _reloading = YES;
 6     
 7 }
 8 
 9 - (void)doneLoadingTableViewData{
10     
11     //  model should call this when its done loading
12     _reloading = NO;
13     [_refreshHeaderView egoRefreshScrollViewDataSourceDidFinishedLoading:self.tableView];//加载完毕后通知footview
14     
15 }

这样描述下来可能比较抽象,总结一下:

footview要做的事情:

从tableview索取滑动信息,更新自己的状态;(“上拉更新数据”,“松开即加载数据”)

从tableview索取滑动信息,如果需要更新,那么更新自己状态(“正在加载数据”),再通知tableview去更新数据;

从tableview获取加载完毕的消息,更新自己状态(“上拉提取更多数据")

tableview要做的事情:

通知footview滑动的信息;

被通知加载数据;

 

参考代码在这里:

http://www.cocoachina.com/bbs/job.php?action=download&aid=26207

免责声明:文章转载自《UITableview 上提刷新》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇yii2中的场景使用PL/SQL 包头和包体下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Sql日期时间格式转换;取年 月 日,函数:DateName()、DATEPART()

一、sql server2000中使用convert来取得datetime数据类型样式(全) 日期数据格式的处理,两个示例: CONVERT(varchar(16), 时间一, 20) 结果:2007-02-01 08:02/*时间一般为getdate()函数或数据表里的字段*/ CONVERT(varchar(10), 时间一, 23) 结果:2007-...

Python源码.py文件打包为.whl文件

1 python源码.py文件打包  1.1 安装工具包 python源文件打包需要用到setuptools和wheel工具包:  1.2建立python项目源文件   建立一个名称为hello的项目包和setup.py文件    其中hello项目包中有一个hello_world.py文件和一个__init__.py文件 hello_world.py...

STM32L15XXX 入门笔记

一、系统时钟默认是32M,最高支持32M,不过下图已经改成72M也可以运行,可能会有什么后遗症,位置在 二、定时器1ms两种方法1、Main.c里 void delay_nms(uint32_t time){ uint32_t i=0; while(time--) { i=12000; //自己定义 while(i--) ; }} 这种方式多少有点...

PyMySQL模块

  PyMySQL是Python操作数据库的模块,在Python3.x版本中用于连接MySQL服务器,即作为Python操作MySQL数据库对象的接口。 安装PyMySQL   pip3 install PyMySQL 导入PyMySQL   import pymysql 连接数据库   格式:conn = pymysql.connect(host=' '...

jdbc 连接数据库

1.什么是jdbc? 答:jdbc是java data base connection 的简写,即java与数据库的连接,是java与数据库之间进行数据交互的工具,书上解释为java访问数据库的API。jdbc是一个轻量级的连接封装,适用于多种数据库,如:oracle、sql server,mysql等等。hibernate则是对jdbc的再封装。 2、j...

Wireshark——网络协议

一、ARP协议 ARP(Address Resolution Protocol)地址解析协议,将IP地址解析成MAC地址。 IP地址在OSI模型第三层,MAC地址在OSI第二层,彼此不直接通信; 在通过以太网发生IP数据包时,先封装第三层(32位IP地址)和第二层(48位MAC地址)的报头; 但由于发送数据包时只知道目标IP地址,不知道其Mac地址,且不能...