iOS UITableView下拉刷新上拉加载更多EGOTableViewPullRefresh类库使用初级剑侠篇(欢迎提建议和分享遇到的问题)

本文主要是介绍iOS UITableView下拉刷新上拉加载更多EGOTableViewPullRefresh类库使用初级剑侠篇(欢迎提建议和分享遇到的问题),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


这篇文章说下:MJRefresh和  EGOTableViewPullRefresh 的使用方法最下面有原理说明,若有不对或者建议请评论指出,先谢谢了:

首先是英文原文和类库下载地址:https://github.com/emreberge/EGOTableViewPullRefresh 

   

然后创建好自己使用的tableview控件接着:

  • 添加 QuartzCore.framework 到你的工程中。

  • 将 EGOTableViewPullRefresh 拖到你的工程目录下。
     
然后在需要使用的类里写上

 

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

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

[plain]  view plain copy
  1. @interface ...ViewController : UITableViewController<EGORefreshTableHeaderDelegate>  
  2. {  
  3.     EGORefreshTableHeaderView *refreshTableHeaderView;  
  4.     BOOL reloading;  
  5. }  
  6. - (void)reloadTableViewDataSource;  
  7. - (void)doneLoadingTableViewData;  

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

[plain]  view plain copy
  1. if (refreshTableHeaderView == nil) {  
  2.           
  3. <span style="white-space:pre">  </span>EGORefreshTableHeaderView *view = [[EGORefreshTableHeaderView alloc] initWithFrame:CGRectMake(0.0f, 0.0f - self.tableView.bounds.size.height, self.view.frame.size.width, self.tableView.bounds.size.height)];  
  4.     view.delegate = self;  
  5.     [self.tableView addSubview:view];  
  6.     refreshTableHeaderView = view;  
  7.     [view release];   
  8. }     
  9. //最后一次更新的时间  
  10. [refreshTableHeaderView refreshLastUpdatedDate];  

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

[plain]  view plain copy
  1. #pragma mark -  
  2. #pragma mark Data Source Loading / Reloading Methods  
  3. //更新列表数据  
  4. - (void)reloadTableViewDataSource{  
  5.     [NSThread detachNewThreadSelector:@selector(updateNewsByPullTable) toTarget:self withObject:nil]; //异步加载数据,不影tableView动作  
  6.     reloading = YES;      
  7. }  
  8. //调用JSON服务获取数据  
  9. - (void)updateNewsByPullTable  
  10. {  
  11.     NSString *str = @"http://....../getAllNews.aspx";  
  12.     NSURL *url = [NSURL URLWithString:str];  
  13.     ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];  
  14.     [request startSynchronous];  
  15.       
  16.     //接收返回数据  
  17.     NSString *response = [request responseString];  
  18.     NSLog(@"%@",response);  
  19.     self.data = [response JSONValue];  
  20.     [self.tableView reloadData];  
  21. }  
  22.   
  23. - (void)doneLoadingTableViewData{  
  24.       
  25.     //model should call this when its done loading  
  26.     reloading = NO;  
  27.     [refreshTableHeaderView egoRefreshScrollViewDataSourceDidFinishedLoading:self.tableView];  
  28.       
  29. }  
  30.   
  31. #pragma mark -  
  32. #pragma mark UIScrollViewDelegate Methods  
  33.   
  34. - (void)scrollViewDidScroll:(UIScrollView *)scrollView{   
  35.       
  36.     [refreshTableHeaderView egoRefreshScrollViewDidScroll:scrollView];  
  37.       
  38. }  
  39.   
  40. - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{  
  41.       
  42.     [refreshTableHeaderView egoRefreshScrollViewDidEndDragging:scrollView];  
  43.       
  44. }  
  45.   
  46.   
  47. #pragma mark -  
  48. #pragma mark EGORefreshTableHeaderDelegate Methods  
  49.   
  50. - (void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView*)view{  
  51.       
  52.     [self reloadTableViewDataSource];  
  53.     [self performSelector:@selector(doneLoadingTableViewData) withObject:nil afterDelay:3.0];  
  54.       
  55. }  
  56.   
  57. - (BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView*)view{  
  58.       
  59.     return reloading; // should return if data source model is reloading  
  60.       
  61. }  
  62.   
  63. - (NSDate*)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView*)view{  
  64.       
  65.     return [NSDate date]; // should return date data source was last changed  
  66.       
  67. }  


4、总结

    总的来说,实现这一功能并不复杂,关键在于-(void)reloadTableViewDataSource这一方法。这里我试了一下,读取数据的操作必须是异步的,要不然和tableView下拉再上弹这个动作会有很明显的延迟。再一次感受到了开源类库的强大,感谢这些大神们的无私贡献,让我们这些iOS开发初学者有机会能做出漂亮的应用。







也可以设置一个基类然后其他uitableview继承它:

.h


static NSString *CELL_ID = @"cell_id";


@class BaseTableView;

@protocol BaseTableViewDelegate <NSObject>


@optional

//下拉事件

- (void)pullDown:(BaseTableView *)tableView;

//上拉事件

- (void)pullUp:(BaseTableView *)tableView;

//选中单元格事件

- (void)didSelectRowAtIndexPath:(BaseTableView *)tabelView indexPath:(NSIndexPath *)indexPath;


@end


typedefvoid(^PullDonwFinish)(void);

typedefvoid(^PullUpFinish)(void);


@interface BaseTableView :UITableView<EGORefreshTableHeaderDelegate,UITableViewDataSource, UITableViewDelegate>

{

   EGORefreshTableHeaderView *_refreshHeaderView;

BOOL _reloading;

   UIButton *_moreButton;

}


@property(nonatomic,retain) NSMutableArray *data;


//是否显示下拉控件

@property(nonatomic,assign)BOOL refreshHeader;

//是否有更多(下一页)

@property(nonatomic,assign)BOOL isMore;


@property(nonatomic,copy)PullDonwFinish finishBlock;

@property(nonatomic,copy)PullUpFinish pullUpBlock;

//上拉代理对象

@property(nonatomic,assign)id<BaseTableViewDelegate> refreshDelegate;




//自动执行下拉动作

-(void)launchRefreshing;


- (void)reloadTableViewDataSource;

- (void)doneLoadingTableViewData;



@end


#import "BaseTableView.h
@implementation BaseTableView


- (id)initWithFrame:(CGRect)frame

{

   self = [superinitWithFrame:frame];

   if (self) {

        // Initialization code

        [self_initViews];

    }

    return self;

}


- (void)awakeFromNib {

    [superawakeFromNib];

    [self_initViews];

}


- (void)_initViews {

    

   self.backgroundColor =RGB(242, 243, 240);

    

    self.refreshHeader =YES;

   self.isMore =YES;

   self.delegate =self;

    self.dataSource =self;

    

    _moreButton = [UIButtonbuttonWithType:UIButtonTypeCustom];

   _moreButton.frame =CGRectMake(0,0, self.width,44);

    _moreButton.backgroundColor = [UIColorclearColor];

    [_moreButtonsetTitle:@""forState:UIControlStateNormal];

    _moreButton.titleLabel.font = [UIFontsystemFontOfSize:12.0f];

    [_moreButtonsetTitleColor:[UIColorlightGrayColor] forState:UIControlStateNormal];

    [_moreButtonaddTarget:selfaction:@selector(loadMoreAction)forControlEvents:UIControlEventTouchUpInside];

    

    UIActivityIndicatorView *activityView = [[UIActivityIndicatorViewalloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];

    activityView.frame =CGRectMake(90,10, 20, 20);

    [activityViewstopAnimating];

    activityView.tag =2013;

    [_moreButtonaddSubview:activityView];

    

    self.tableFooterView =_moreButton;

}


-(void)launchRefreshing

{

    if (_reloading) {

       _reloading = NO;

        

        [UIViewanimateWithDuration:0.4animations:^{

            [selfsetContentOffset:CGPointMake(0, -80)];

        }completion:^(BOOL finished) {

           if (finished) {

               //设置停止拖拽

                [_refreshHeaderViewperformSelector:@selector(egoRefreshScrollViewDidEndDragging:)withObject:selfafterDelay:0.2];

            }

        }];

    }else{

        //下拉之前还原_refreshHeaderViewstate

        [_refreshHeaderViewsetState:EGOOPullRefreshNormal];

        

        [UIViewanimateWithDuration:0.4animations:^{

            [selfsetContentOffset:CGPointMake(0, -80)];

        }completion:^(BOOL finished) {

           if (finished) {

                [_refreshHeaderViewsetState:EGOOPullRefreshPulling];

               //设置停止拖拽

                [_refreshHeaderViewperformSelector:@selector(egoRefreshScrollViewDidEndDragging:)withObject:selfafterDelay:0.2];

            }

        }];

    }

}


- (void)setRefreshHeader:(BOOL)refreshHeader {

   _refreshHeader = refreshHeader;

    

    if (self.refreshHeader) {

        if (_refreshHeaderView ==nil) {

           //创建下拉控件

            _refreshHeaderView = [[EGORefreshTableHeaderViewalloc] initWithFrame:CGRectMake(0.0f,0.0f - self.bounds.size.height,self.frame.size.width,self.bounds.size.height)];

            _refreshHeaderView.delegate =self;

            _refreshHeaderView.backgroundColor = [UIColorclearColor];

            [_refreshHeaderViewrefreshLastUpdatedDate];

        }

        

        [selfaddSubview:_refreshHeaderView];

    }else {

       if (_refreshHeaderView.superview !=nil) {

            [_refreshHeaderViewremoveFromSuperview];

        }

    }

}


//上拉按钮的点击事件

- (void)loadMoreAction {

    

   if (self.pullUpBlock !=nil) {

       self.pullUpBlock();

    }

    

    //调用代理对象的协议方法

   if ([self.refreshDelegaterespondsToSelector:@selector(pullUp:)]) {

        [self.refreshDelegatepullUp:self];

    }

    

    [_moreButtonsetTitle:@"正在加载..."forState:UIControlStateNormal];

    UIActivityIndicatorView *activityView = (UIActivityIndicatorView *)[_moreButtonviewWithTag:2013];

    [activityViewstartAnimating];

}


- (void)setIsMore:(BOOL)isMore {

   _isMore = isMore;

   if (self.isMore) {

        [_moreButtonsetTitle:@"加载更多数据"forState:UIControlStateNormal];

       _moreButton.enabled =YES;

    }else {

        [_moreButtonsetTitle:@"没有更多数据"forState:UIControlStateNormal];

       _moreButton.enabled =NO;

    }

    

    UIActivityIndicatorView *activityView = (UIActivityIndicatorView *)[_moreButtonviewWithTag:2013];

    [activityViewstopAnimating];

}


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

{

    [tableView deselectRowAtIndexPath:indexPathanimated:YES];

}


-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

{

    return self.data.count;

}


-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

    UITableViewCell *cell = [tableViewdequeueReusableCellWithIdentifier:CELL_ID];

   if (!cell) {

        cell = [[UITableViewCellalloc] initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:CELL_ID];

    }

   return cell;

}


/*________________________下拉控件相关方法________________________________*/

#pragma mark -

#pragma mark Data Source Loading / Reloading Methods


- (void)reloadTableViewDataSource{

    _reloading = YES;

    

}


//收起下拉刷新

- (void)doneLoadingTableViewData{

    _reloading = NO;

    [_refreshHeaderViewegoRefreshScrollViewDataSourceDidFinishedLoading:self];

}



#pragma mark -

#pragma mark UIScrollViewDelegate Methods


- (void)scrollViewDidScroll:(UIScrollView *)scrollView{

    

    [_refreshHeaderViewegoRefreshScrollViewDidScroll:scrollView];

    

}


- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{

    

    [_refreshHeaderViewegoRefreshScrollViewDidEndDragging:scrollView];

    

    //偏移量.y + tableView.height =内容的高度

    //h是上拉超出来的尺寸

   float h = scrollView.contentOffset.y + scrollView.height - scrollView.contentSize.height;

   if (h > 30 &&self.isMore) {

        [selfloadMoreAction];

    }

}



#pragma mark -

#pragma mark EGORefreshTableHeaderDelegate Methods

//下拉到一定距离,手指放开时调用

- (void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView*)view{

    

    [selfreloadTableViewDataSource];

    

    //停止加载,弹回下拉

    // [self performSelector:@selector(doneLoadingTableViewData)

    //               withObject:nil afterDelay:3.0];

   if (self.finishBlock !=nil) {

       self.finishBlock();

    }

    

   if ([self.refreshDelegaterespondsToSelector:@selector(pullDown:)]) {

        [self.refreshDelegatepullDown:self];

    }

}


- (BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView*)view{

    

    return_reloading;// should return if data source model is reloading

}


//取得下拉刷新的时间

- (NSDate *)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView*)view{

    

    return [NSDatedate]; // should return date data source was last changed

    

}



@end

 浅谈下拉刷新和上拉加载更多原理:

下文出自:  http://blog.csdn.net/hmt20130412/article/details/32695305

 很多App中,新闻或者展示类都存在下拉刷新和上拉加载的效果,网上提供了实现这种效果的第三方类(详情请见MJRefresh和  EGOTableViewPullRefresh ),用起来很方便,但是闲暇之余,我们可以思考下,这种效果实现的原理是什么,我以前说过,只要是动画都是骗人的,只要不是硬件问题大部分效果都能在系统UI的基础上做出来. 

            @下面是关键代码分析:

// 下拉刷新的原理
- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView
{if (scrollView.contentOffset.y < - 100) {
  
  [UIView animateWithDuration:1.0 animations:^{
      
      //  frame发生偏移,距离顶部150的距离(可自行设定)
      self.tableView.contentInset = UIEdgeInsetsMake(150.0f, 0.0f, 0.0f, 0.0f);
  } completion:^(BOOL finished) {
      
      /**
       *  发起网络请求,请求刷新数据
       */  }];}
}// 上拉加载的原理
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{NSLog(@"%f",scrollView.contentOffset.y);NSLog(@"%f",scrollView.frame.size.height);NSLog(@"%f",scrollView.contentSize.height);/***  关键-->*  scrollView一开始并不存在偏移量,但是会设定contentSize的大小,所以contentSize.height永远都会比contentOffset.y高一个手机屏幕的*  高度;上拉加载的效果就是每次滑动到底部时,再往上拉的时候请求更多,那个时候产生的偏移量,就能让contentOffset.y + 手机屏幕尺寸高大于这*  个滚动视图的contentSize.height*/if (scrollView.contentOffset.y + scrollView.frame.size.height >= scrollView.contentSize.height) {
  
  NSLog(@"%d %s",__LINE__,__FUNCTION__);
  [UIView commitAnimations];
  
  [UIView animateWithDuration:1.0 animations:^{
      //  frame发生的偏移量,距离底部往上提高60(可自行设定)
      self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 60, 0);
  } completion:^(BOOL finished) {
      
      /**
       *  发起网络请求,请求加载更多数据
       *  然后在数据请求回来的时候,将contentInset改为(0,0,0,0)
       */
  }];}
}

这篇关于iOS UITableView下拉刷新上拉加载更多EGOTableViewPullRefresh类库使用初级剑侠篇(欢迎提建议和分享遇到的问题)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1088524

相关文章

linux生产者,消费者问题

pthread_cond_wait() :用于阻塞当前线程,等待别的线程使用pthread_cond_signal()或pthread_cond_broadcast来唤醒它。 pthread_cond_wait() 必须与pthread_mutex 配套使用。pthread_cond_wait()函数一进入wait状态就会自动release mutex。当其他线程通过pthread

C语言中联合体union的使用

本文编辑整理自: http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=179471 一、前言 “联合体”(union)与“结构体”(struct)有一些相似之处。但两者有本质上的不同。在结构体中,各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和。而在“联合”中,各成员共享一段内存空间, 一个联合变量

问题:第一次世界大战的起止时间是 #其他#学习方法#微信

问题:第一次世界大战的起止时间是 A.1913 ~1918 年 B.1913 ~1918 年 C.1914 ~1918 年 D.1914 ~1919 年 参考答案如图所示

[职场] 护理专业简历怎么写 #经验分享#微信

护理专业简历怎么写   很多想成为一名护理方面的从业者,但是又不知道应该怎么制作一份简历,现在这里分享了一份护理方面的简历模板供大家参考。   蓝山山   年龄:24   号码:12345678910   地址:上海市 邮箱:jianli@jianli.com   教育背景   时间:2011-09到2015-06   学校:蓝山大学   专业:护理学   学历:本科

Tolua使用笔记(上)

目录   1.准备工作 2.运行例子 01.HelloWorld:在C#中,创建和销毁Lua虚拟机 和 简单调用。 02.ScriptsFromFile:在C#中,对一个lua文件的执行调用 03.CallLuaFunction:在C#中,对lua函数的操作 04.AccessingLuaVariables:在C#中,对lua变量的操作 05.LuaCoroutine:在Lua中,

大学湖北中医药大学法医学试题及答案,分享几个实用搜题和学习工具 #微信#学习方法#职场发展

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式,可以快速查找问题解析,加深对题目答案的理解。 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语音听题、本地搜题、顺序阅读、模拟考试、组卷考试、赶快下载吧! 2.彩虹搜题 这是个老公众号了 支持手写输入,截图搜题,详细步骤,解题必备

Vim使用基础篇

本文内容大部分来自 vimtutor,自带的教程的总结。在终端输入vimtutor 即可进入教程。 先总结一下,然后再分别介绍正常模式,插入模式,和可视模式三种模式下的命令。 目录 看完以后的汇总 1.正常模式(Normal模式) 1.移动光标 2.删除 3.【:】输入符 4.撤销 5.替换 6.重复命令【. ; ,】 7.复制粘贴 8.缩进 2.插入模式 INSERT

2024.6.24 IDEA中文乱码问题(服务器 控制台 TOMcat)实测已解决

1.问题产生原因: 1.文件编码不一致:如果文件的编码方式与IDEA设置的编码方式不一致,就会产生乱码。确保文件和IDEA使用相同的编码,通常是UTF-8。2.IDEA设置问题:检查IDEA的全局编码设置和项目编码设置是否正确。3.终端或控制台编码问题:如果你在终端或控制台看到乱码,可能是终端的编码设置问题。确保终端使用的是支持你的文件的编码方式。 2.解决方案: 1.File -> S

Lipowerline5.0 雷达电力应用软件下载使用

1.配网数据处理分析 针对配网线路点云数据,优化了分类算法,支持杆塔、导线、交跨线、建筑物、地面点和其他线路的自动分类;一键生成危险点报告和交跨报告;还能生成点云数据采集航线和自主巡检航线。 获取软件安装包联系邮箱:2895356150@qq.com,资源源于网络,本介绍用于学习使用,如有侵权请您联系删除! 2.新增快速版,简洁易上手 支持快速版和专业版切换使用,快速版界面简洁,保留主

如何免费的去使用connectedpapers?

免费使用connectedpapers 1. 打开谷歌浏览器2. 按住ctrl+shift+N,进入无痕模式3. 不需要登录(也就是访客模式)4. 两次用完,关闭无痕模式(继续重复步骤 2 - 4) 1. 打开谷歌浏览器 2. 按住ctrl+shift+N,进入无痕模式 输入网址:https://www.connectedpapers.com/ 3. 不需要登录(也就是