IOS开发笔记(2)EGOTableViewPullRefresh实现列表的下拉刷新功能

本文详细介绍如何在iOS应用中实现列表的上拉刷新功能,包括EGOTableViewPullRefresh库的使用方法,从配置资源文件到实现代码的具体步骤。


http://blog.youkuaiyun.com/xiaofansong/article/details/8260258



现在流行的列表上拉刷新基本上都是使用的EGOTableViewPullRefresh开源的类库。

1、到github上下载EGOTableViewPullRefresh

          https://github.com/enormego/EGOTableViewPullRefresh


  2、下载后的文件夹中包含以下内容

        

    将EGOTableViewPullRefresh中的Resources文件夹中的所有图片全部都拷贝到自己的工程的Resources文件夹下,这些图片是下拉箭头及tableView的headerView的背景图片。在EGOTableViewPullRefresh文件夹下的Classes文件夹下的View文件夹下有两个文件,分别是EGORefreshTableHeaderView.h和EGORefreshTableHeaderView.m文件,将这两个文件放到自己的工程下。到此为止准备工作就做完了。

3、下拉是一个刷新的工作,所以需要我们添加的代码无非就是数据刷新的代码。

(1)在.h文件中添加如下代码

  1. #import "EGORefreshTableHeaderView.h"  
  2.   
  3. @interface RootViewController : UITableViewController  <EGORefreshTableHeaderDelegate, UITableViewDelegate, UITableViewDataSource>{  
  4.       
  5.     EGORefreshTableHeaderView *_refreshHeaderView;  
  6.       
  7.     //  Reloading var should really be your tableviews datasource  
  8.     //  Putting it here for demo purposes   
  9.     BOOL _reloading;  
  10. }  
  11.   
  12. - (void)reloadTableViewDataSource;  
  13. - (void)doneLoadingTableViewData;  
#import "EGORefreshTableHeaderView.h"

@interface RootViewController : UITableViewController  <EGORefreshTableHeaderDelegate, UITableViewDelegate, UITableViewDataSource>{
	
	EGORefreshTableHeaderView *_refreshHeaderView;
	
	//  Reloading var should really be your tableviews datasource
	//  Putting it here for demo purposes 
	BOOL _reloading;
}

- (void)reloadTableViewDataSource;
- (void)doneLoadingTableViewData;


(2)在- (void)viewDidLoad函数中添加下面的代码。

  1. if (_refreshHeaderView == nil) {  
  2.           
  3.         EGORefreshTableHeaderView *view = [[EGORefreshTableHeaderView alloc] initWithFrame: CGRectMake(0.0f, self.tableView.contentSize.height, 320, 650)];  
  4.         NSLog(@"%@", NSStringFromCGRect( view.frame ));  
  5.         view.delegate = self;  
  6.         [self.tableView addSubview:view];  
  7.         _refreshHeaderView = view;  
  8.         [view release];  
  9.           
  10.     }  
  11.       
  12.     //  update the last update date  
  13.     [_refreshHeaderView refreshLastUpdatedDate];  
if (_refreshHeaderView == nil) {
		
		EGORefreshTableHeaderView *view = [[EGORefreshTableHeaderView alloc] initWithFrame: CGRectMake(0.0f, self.tableView.contentSize.height, 320, 650)];
        NSLog(@"%@", NSStringFromCGRect( view.frame ));
		view.delegate = self;
		[self.tableView addSubview:view];
		_refreshHeaderView = view;
		[view release];
		
	}
	
	//  update the last update date
	[_refreshHeaderView refreshLastUpdatedDate];


(3)在对应的.m文件中添加如下方法

  1. #pragma mark -  
  2. #pragma mark Data Source Loading / Reloading Methods  
  3.   
  4. - (void)reloadTableViewDataSource{  
  5.       
  6.     //  should be calling your tableviews data source model to reload  
  7.     //  put here just for demo  
  8.     _reloading = YES;  
  9.       
  10. }  
  11.   
  12. - (void)doneLoadingTableViewData{  
  13.       
  14.     //  model should call this when its done loading  
  15.     _reloading = NO;  
  16.     [_refreshHeaderView egoRefreshScrollViewDataSourceDidFinishedLoading:self.tableView];  
  17.       
  18. }  
  19.   
  20.   
  21. #pragma mark -  
  22. #pragma mark UIScrollViewDelegate Methods  
  23.   
  24. - (void)scrollViewDidScroll:(UIScrollView *)scrollView{   
  25.       
  26.     [_refreshHeaderView egoRefreshScrollViewDidScroll:scrollView];  
  27.           
  28. }  
  29.   
  30. - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{  
  31.       
  32.     [_refreshHeaderView egoRefreshScrollViewDidEndDragging:scrollView];  
  33.       
  34. }  
  35.   
  36.   
  37. #pragma mark -  
  38. #pragma mark EGORefreshTableHeaderDelegate Methods  
  39.   
  40. - (void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView*)view{  
  41.       
  42.     [self reloadTableViewDataSource];  
  43.     [self performSelector:@selector(doneLoadingTableViewData) withObject:nil afterDelay:4.0];  
  44.       
  45. }  
  46.   
  47. - (BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView*)view{  
  48.       
  49.     return _reloading; // should return if data source model is reloading  
  50.       
  51. }  
  52.   
  53. - (NSDate*)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView*)view{  
  54.       
  55.     return [NSDate date]; // should return date data source was last changed  
  56.       
  57. }  
#pragma mark -
#pragma mark Data Source Loading / Reloading Methods

- (void)reloadTableViewDataSource{
	
	//  should be calling your tableviews data source model to reload
	//  put here just for demo
	_reloading = YES;
	
}

- (void)doneLoadingTableViewData{
	
	//  model should call this when its done loading
	_reloading = NO;
	[_refreshHeaderView egoRefreshScrollViewDataSourceDidFinishedLoading:self.tableView];
	
}


#pragma mark -
#pragma mark UIScrollViewDelegate Methods

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{	
	
	[_refreshHeaderView egoRefreshScrollViewDidScroll:scrollView];
		
}

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
	
	[_refreshHeaderView egoRefreshScrollViewDidEndDragging:scrollView];
	
}


#pragma mark -
#pragma mark EGORefreshTableHeaderDelegate Methods

- (void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView*)view{
	
	[self reloadTableViewDataSource];
	[self performSelector:@selector(doneLoadingTableViewData) withObject:nil afterDelay:4.0];
	
}

- (BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView*)view{
	
	return _reloading; // should return if data source model is reloading
	
}

- (NSDate*)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView*)view{
	
	return [NSDate date]; // should return date data source was last changed
	
}


4、总结

A:这个是在底部加刷新。如果在顶部加刷新那么只要修改下ViewDidload的创建代码

  1. EGORefreshTableHeaderView *view = [[EGORefreshTableHeaderView alloc] initWithFrame:CGRectMake(0.0f, -320.0f, self.view.frame.size.width, 320)];  
EGORefreshTableHeaderView *view = [[EGORefreshTableHeaderView alloc] initWithFrame:CGRectMake(0.0f, -320.0f, self.view.frame.size.width, 320)];

B:如果想同时在顶部或者底部都加上刷新,可以参考我另外一个帖子(关于糗百,开发笔记一里面所使用的方法)

C:如果想实现在列表最后一行实现点击查询,那么可以在列表下多加一行,自己写一个类继承UItableviewcell,然后在点击事件里面做一个判断。

D:假如遇到数据刷新之后那个顶部的view还在刷新,这个可能是egoRefreshTableHeaderDidTriggerRefresh里面同步执行的代码

  1. - (void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView *)view  
  2. {  
  3.     [self reloadTableViewDataSource];  
  4.     [self performSelector:@selector(refresh) withObject:nil afterDelay:2.0f];  
  5.    // [self refresh];  
  6.       
  7. }  
- (void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView *)view
{
    [self reloadTableViewDataSource];
    [self performSelector:@selector(refresh) withObject:nil afterDelay:2.0f];
   // [self refresh];
    
}


这里读取数据的操作必须是异步的,要不然和tableView下拉再上弹这个动作会有很明显的延迟。

先看效果: https://renmaiwang.cn/s/jkhfz Hue系列产品将具备高度的个性化定制能力,并且借助内置红、蓝、绿三原色LED的灯泡,能够混合生成1600万种不同色彩的灯光。 整个操作流程完全由安装于iPhone上的应用程序进行管理。 这一创新举措为智能照明控制领域带来了新的启示,国内相关领域的从业者也积极投身于相关研究。 鉴于Hue产品采用WiFi无线连接方式,而国内WiFi网络尚未全面覆盖,本研究选择应用更为普及的蓝牙技术,通过手机蓝牙与单片机进行数据交互,进而产生可调节占空比的PWM信号,以此来控制LED驱动电路,实现LED的调光功能以及DIY调色方案。 本文重点阐述了一种基于手机蓝牙通信的LED灯设计方案,该方案受到飞利浦Hue智能灯泡的启发,但考虑到国内WiFi网络的覆盖限制,故而选用更为通用的蓝牙技术。 以下为相关技术细节的详尽介绍:1. **智能照明控制系统**:智能照明控制系统允许用户借助手机应用程序实现远程控制照明设备,提供个性化的调光及色彩调整功能。 飞利浦Hue作为行业领先者,通过红、蓝、绿三原色LED的混合,能够呈现1600万种颜色,实现了全面的定制化体验。 2. **蓝牙通信技术**:蓝牙技术是一种低成本、短距离的无线传输方案,工作于2.4GHz ISM频段,具备即插即用和强抗干扰能力。 蓝牙协议栈由硬件层和软件层构成,提供通用访问Profile、服务发现应用Profile以及串口Profiles等丰富功能,确保不同设备间的良好互操作性。 3. **脉冲宽度调制调光**:脉冲宽度调制(PWM)是一种高效能的调光方式,通过调节脉冲宽度来控制LED的亮度。 当PWM频率超过200Hz时,人眼无法察觉明显的闪烁现象。 占空比指的...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值