iOS下拉刷新的实现
2015-03-01 10:06
134 查看
下拉刷新的实现
首先IOS是没有自带下拉刷新的,虽然我们平时遇到大量APP是具有下拉刷新功能,但是很不幸,IOS的确没有做下拉刷新。而我们平时看到的大部分下拉刷新都是采用第三方库:EGORefreshTableHeaderView下载地址为:https://github.com/enormego/EGOTableViewPullRefresh
和大部分第三方库一样,zip展开后其中带有一个demo和一个库文件夹,如果要详细了解,建议先看看demo。其实这个第三方的用法也相当简单:
1. 将第三方库中的库文件夹拖到XCode中,并且选择拷贝。由于EGOTableViewPullRefresh依赖于IOS的QuartzCore.frameworks,所以别忘了加上。
2. 在你自己的TableViewController中import入EGORefreshTableHeaderView.h
3. 在头文件中加入以下代码,其中reloadTableViewDataSource是在下拉松开后,会调用的代码,而doneLoadingTableViewData是刷新成功之后调用的代码,主要用于隐藏table上面的下拉区域。
[cpp] view
plaincopy
{
EGORefreshTableHeaderView *_refreshHeaderView;
BOOL _reloading;
}
-(void)reloadTableViewDataSource;
-(void)doneLoadingTableViewData;
4. 在m文件中初始化下拉刷新:
[cpp] view
plaincopy
//初始化下拉刷新
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;
}
// update the last update date
[_refreshHeaderView refreshLastUpdatedDate];
5. 在m文件中实现以下方法:
[cpp] view
plaincopy
#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:3.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
}
其中,我们可以看到,其实下拉刷新是触发了egoRefreshTableHeaderDidTriggerRefresh,而其中做了两件事情,一件是启动需要刷新的动作,这个需要用户我们定义完善reloadTableViewDataSource。第二件事情是设定3秒后调用doneLoadingTableViewData,当然我们可以在任何地方调用doneLoadingTableViewData来关闭下拉区域,这里是避免长时间无响应,约定一个最大时间。(doneLoadingTableViewData可以连续多次调用,但是效果只有一次)
此时你已经可以运行代码,会发现,已经成功地添加了一个下拉功能,当然,具体如何刷新,那是需要自己去维护。
二、下拉刷新失败的问题
第一个可能失败的问题是,主线程与非主线程中刷新UI。一般来说IOS是不支持在非主线程中刷新UI的,会造成各种各样的问题导致程序崩溃。因此,如果下拉刷新是一个耗时操作,又是先分线程中进行的(比如发送HTTP Request向服务器发送请求获取数据,在数据成功返回后刷新UI),那么就需要将刷新过程放入一个函数,在分线程中调用[selfperformSelectorOnMainThread:@selector(refreshTable)withObject:nilwaitUntilDone:NO];告诉主线程如何刷新UI。其中,refreshTable为刷新函数。
第二个问题,纠结了好久是有关自定义TableViewController中的cell刷新。用IB定义了cell的外观,并且为cell中的所有view都用tag标记。需要采用来刷新:
[cpp] view
plaincopy
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"PrivateMessageCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
// Configure the cell...
PrivateMessageListItem *item = (PrivateMessageListItem *)[privateMessageList objectAtIndex:indexPath.row];
//用户头像
UIImageView *objectProfileImage = (UIImageView *)[cell viewWithTag:1000];
[objectProfileImage setImageWithURL:[NSURL URLWithString: item.contacter_info.pic]];
return cell;
}
其中千万别采用[self.view viewWithTag: 1000]来获取元素。这种方法能成功load数据,但是第二次刷新的时候就不会成功。
相关文章推荐
- IOS学习笔记之EGOTableViewPullRefresh实现下拉刷新
- ios下拉刷新,基于EGOTableViewPullRefresh框架实现
- 新手自定义控件,创建属于自己的下拉刷新(一)---Android,ListView实现IOS的弹性效果
- 使用react-native-pull实现跨平台Android&IOS下拉刷新滑动回弹效果
- 第三方 MJRefresh 实现 iOS中 上拉加载更多,下拉刷新数据
- IOS学习笔记34—EGOTableViewPullRefresh实现下拉刷新
- iOS UIScrollView 的下拉刷新和上拉加载的实现
- iOS经典讲解之实现上拉刷新和下拉刷新
- iOS聊天下拉刷新聊天记录的实现
- IOS UITableView下拉刷新和上拉加载功能的实现
- iOS开发之UITableView的下拉刷新实现
- [iOS]iOS6新特征:UIRefreshControl实现下拉刷新
- iOS UITableView 实现上拉及下拉刷新
- 仿IOS版QQ的下拉刷新头实现原理
- ios 下拉刷新 EGO实现
- iOS UIWebView下拉刷新实现
- iOS下拉刷新的实现
- IOS开发---菜鸟学习之路--(九)-利用PullingRefreshTableView实现下拉刷新
- iOS开发用AFNetworking和MJRefresh实现网络请求和下拉刷新、上拉加载
- iOS UITableView 的下拉刷新和上拉加载的实现