`
jsntghf
  • 浏览: 2511499 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

下拉刷新的实现

    博客分类:
  • iOS
阅读更多

首先,用到一个开源框架,可以去https://github.com/enormego/EGOTableViewPullRefresh下载。

 

然后,将里面的EGORefreshTableHeaderView.h和EGORefreshTableHeaderView.m拷到相应的项目里,在需要下拉刷新的页面对应的视图控制器中添加以下代码。

 

头文件:

 

#import "EGORefreshTableHeaderView.h"

@interface RootViewController : UITableViewController  <EGORefreshTableHeaderDelegate, UITableViewDelegate, UITableViewDataSource>{	
	EGORefreshTableHeaderView *_refreshHeaderView;
	BOOL _reloading;
}

- (void)reloadTableViewDataSource;
- (void)doneLoadingTableViewData;
@end

 

实现文件:

 

#import "RootViewController.h"

@implementation RootViewController

- (void)viewDidLoad {
    [super viewDidLoad];
	
	if (_refreshHeaderView == nil) {		
		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)];
		view.delegate = self;
		[self.tableView addSubview:view];
		_refreshHeaderView = view;
		[view release];		
	}
	
	[_refreshHeaderView refreshLastUpdatedDate];	
}

#pragma mark -
#pragma mark UITableViewDataSource

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 10;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 4;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    static NSString *CellIdentifier = @"Cell";
    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }
	
    return cell;
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{	
	return [NSString stringWithFormat:@"Section %i", section];	
}

#pragma mark -
#pragma mark Data Source Loading / Reloading Methods

- (void)reloadTableViewDataSource{
	_reloading = YES;	
}

- (void)doneLoadingTableViewData{
	_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:3.0];	
}

- (BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView*)view{	
	return _reloading; 
}

- (NSDate*)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView*)view{	
	return [NSDate date]; 	
}

#pragma mark -
#pragma mark Memory Management

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

- (void)viewDidUnload {
	_refreshHeaderView=nil;
}

- (void)dealloc {	
	_refreshHeaderView = nil;
    [super dealloc];
}

@end

 

最后,一个很重要的步骤,别忘了加入QuartzCore.framework框架。

 

上文的实现中有个这样的方法:

 

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

 

显然,这是有问题的。当触发刷新的时候,我们需要和服务端进行交互,这时就会执行这个代理方法,首先调用了reloadTableViewDataSource,表示要和服务端进行交互了,此时_reloading值为YES,3秒后又调用了doneLoadingTableViewData,从而结束刷新效果的显示,我们实际上是假设这时候服务端已经正常将数据发送到客户端来了。事实上,实际收到服务端的数据所用的时间是不确定的,所以,应该在数据返回后再结束刷新效果。

 

- (void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView*)view{      
    [self reloadTableViewDataSource];  
    //发送异步请求的代码    
}

- (void)requestFinished:(ASIHTTPRequest *)request {
    [self doneLoadingTableViewData];
}

 

分享到:
评论
2 楼 jsntghf 2015-01-22  
daocaoren_135 写道
这个字针对苹果系统啊?有安卓版本没有?

安卓的话可以用RTPullListView
1 楼 daocaoren_135 2015-01-22  
这个字针对苹果系统啊?有安卓版本没有?

相关推荐

    android 下拉刷新实现原理

    Android 下拉刷新实现原理 Android 下拉刷新框架实现 下拉刷新是一种适用于按照从新到旧的时间顺序排列 feeds 的应用,在这种应用场景中,看完旧的内容时,用户会很自然地下拉查找更新的内容,因此下拉刷新就显得...

    下拉刷新实现

    本文将详细介绍如何在Android平台上实现下拉刷新功能。 一、下拉刷新基础概念 下拉刷新是一种用户体验设计模式,主要用于动态数据流的应用场景,如新闻、邮件等。当用户下拉界面时,会触发刷新操作,加载新的内容...

    今日头条首页下拉刷新实现含案例

    总结来说,“今日头条首页下拉刷新实现”涉及到移动应用开发中的用户交互设计、网络请求、数据处理以及动画效果等多个方面。开发者需要理解相关组件的工作原理,熟练运用API,同时关注用户体验,才能打造出流畅、...

    IOS下拉刷新Demo实现

    本教程将介绍如何使用EGOTableViewPullRefresh开源库在iOS应用中实现下拉刷新功能,并针对原代码进行一些自定义以支持中英文显示和调整刷新时间格式。 首先,EGOTableViewPullRefresh是由Egor Gorin开发的一个轻量...

    ListView上拉加载下拉刷新实现

    "ListView上拉加载下拉刷新实现"这个主题是关于如何使ListView具有上拉加载更多数据和下拉刷新当前显示内容的功能。这两种交互方式在现代移动应用中非常常见,提高了用户体验,让用户能够方便地获取或更新列表中的...

    Android下拉刷新实现一源码

    Android下拉刷新实现一。使用组合View的方式,先自定义一个布局继承自LinearLayout,然后在这个布局中加入下拉头和ListView这两个子元素,并让这两个子元素纵向排列。初始化的时候,让下拉头向上偏移出屏幕,这样...

    HarmonyOS应用开发-下拉刷新实现.docx

    HarmonyOS 应用开发 - 下拉刷新实现 HarmonyOS 是华为自研的操作系统,具有轻便、灵活、安全的特点。下拉刷新是移动应用程序中常用的交互方式,本文将介绍 HarmonyOS 应用开发中下拉刷新的实现。 创建项目 要实现...

    Android 开源的下拉刷新 Eclipse版本

    `PullToRefreshListFragment`这个名字暗示了这是一个针对ListFragment的下拉刷新实现。ListFragment是Android SDK中的一个类,用于在Fragment中展示ListView。集成下拉刷新功能后,用户在列表顶部下拉即可刷新列表...

    5种uni-app 页面下拉刷新方法-源码示例.zip

    本资料"5种uni-app 页面下拉刷新方法-源码示例.zip"提供了五种不同的实现方式,让我们详细探讨这些方法。 1. **基础API使用:uni.startPullDownRefresh()** uni-app提供了一个名为`uni.startPullDownRefresh()`的...

    类似微信信息界面的下拉刷新实现

    本教程将详细讲解如何实现一个类似微信信息界面的下拉刷新功能。 1. **下拉刷新原理**: 下拉刷新的核心机制是监听用户的滑动手势,当用户将列表顶部下拉到一定程度时,触发一个回调函数,该函数负责更新数据源并...

    简单上拉加载下拉刷新实现

    总的来说,实现上拉加载和下拉刷新的关键在于理解ListView或RecyclerView的滚动机制,以及正确集成和配置相应的库。开发者需要根据自己的需求选择合适的库,理解其内部原理,以便进行定制化开发。同时,注意优化性能...

    上拉加载更多,下拉刷新实现思路

    实现下拉刷新的关键步骤如下: 1. **监听滑动事件**:首先,我们需要监听ListView的滑动事件,这可以通过重写OnScrollListener的onScroll()方法来实现。在该方法中,我们可以通过计算滚动状态和滚动距离来判断是否...

    android 上拉加载。下拉刷新实现

    1. 基本原理:下拉刷新通常在ListView、RecyclerView或SwipeRefreshLayout等组件中实现。当用户快速滑动到列表顶部并保持一段时间,会触发刷新动作,显示一个刷新指示器,然后后台数据获取更新,最后更新UI。 2. ...

    ListView下拉刷新实现

    本教程将详细讲解如何在ListView中实现下拉刷新功能。 首先,我们需要理解下拉刷新的基本原理。这个功能通常通过监听ListView的滑动事件来实现,当用户从顶部向下滑动时,如果达到一定的阈值,就会触发一个刷新动作...

    h5下拉刷新实现

    在本教程中,我们将探讨如何使用iScroll库来实现H5的下拉刷新功能。 iScroll是一个强大的JavaScript滚动插件,它提供了平滑的滚动效果,同时支持触摸设备和鼠标滚轮。iScroll不仅能够处理固定定位、浮动元素、CSS3...

    iscroll5下拉刷新实现

    iscroll5的下拉实现,修改了iscroll-zoom.js(在原有版本上多了缩放功能的版本)的部分代码,具体修改可见http://www.duanzhihe.com/1045.html。欢迎再交流与讨论

    安卓下拉上拉刷新相关-百行代码搞定下拉刷新通过继承ScrollView编写.zip

    `千万别双击.url`是一个链接,可能指向了更详细的教程或者相关的资源库,帮助开发者了解更多的下拉刷新实现方式和最佳实践。 总的来说,通过继承ScrollView实现下拉刷新是一种基础的实现方式,适合初学者理解下拉...

    Android下拉刷新Demo

    "PullToRefresh-master"这个文件名可能指向了一个开源库,通常用于简化Android下的下拉刷新实现。在Android开发中,有许多这样的库可供选择,如`SwipeRefreshLayout`(官方支持)和` PtrLibrary`(第三方库)。这些...

    android下拉刷新库文件

    3. Android下拉刷新实现方式: 在Android中,有多种实现下拉刷新的方法: - 1) 使用SwipeRefreshLayout: Google官方提供的`androidx.swiperefreshlayout.widget.SwipeRefreshLayout`是实现下拉刷新的标准组件。它...

Global site tag (gtag.js) - Google Analytics