IOS怎么实现一个UITableView的下拉刷新

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IOS怎么实现一个UITableView的下拉刷新相关的知识,希望对你有一定的参考价值。

1 实现tableview的下拉刷新
2
3 tableview滑动就会触发这个方法?
4 */
5 -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
6
7 //当tableview下拉到最后一行的时候才触发
8 if (indexPath.row == self.m_data.count - 1)
9
10 //定义一个UIView
11 UIView *footSpinnerView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 60.0f)];
12
13 //顶一个有刷新图标的view
14 UIActivityIndicatorView *activity = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(130.0f, 0.0f, 60.0f, 60.0f)];
15 activity.color = [UIColor redColor];
16 [activity startAnimating];//启动有刷新图标的view
17
18 footSpinnerView.backgroundColor = [UIColor grayColor];
19 [footSpinnerView addSubview:activity];
20
21 //设置footerview
22 self.myTableView.tableFooterView = footSpinnerView;
23
24 // self.myTableView.tableHeaderView = footSpinnerView;
25
26 dispatch_queue_t queue = dispatch_queue_create("my queue", nil);
27
28 //在后台线程添加数据
29 dispatch_async(queue, ^(void)
30
31 [self.m_data addObject:@"1000"];
32 [self.m_data addObject:@"1001"];
33 [self.m_data addObject:@"1002"];
34 [self.m_data addObject:@"1003"];
35 [self.m_data addObject:@"1004"];
36
37 );
38
39 //添加完数据就重新加载数据
40 dispatch_async(queue, ^(void)
41
42 sleep(2);
43 dispatch_sync(dispatch_get_main_queue(), ^(void)
44
45 [self.myTableView reloadData];
46 );
47 );
48
49 // [self.myTableView reloadData];
50 dispatch_release(queue);
51 [footSpinnerView release];
52 [activity release];
53
54 // else if (indexPath.row == 0)
55 //
56 // UIView *footSpinnerView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 60.0f)];
57 // UIActivityIndicatorView *activity = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(130.0f, 0.0f, 60.0f, 60.0f)];
58 // activity.color = [UIColor redColor];
59 // [activity startAnimating];
60 //
61 // footSpinnerView.backgroundColor = [UIColor grayColor];
62 // [footSpinnerView addSubview:activity];
63 //
64 // // self.myTableView.tableFooterView = footSpinnerView;
65 //
66 // self.myTableView.tableHeaderView = footSpinnerView;
67 //
68 // dispatch_queue_t queue = dispatch_queue_create("my queue", nil);
69 //
70 // dispatch_async(queue, ^(void)
71 //
72 // [self.m_data insertObject:@"1000" atIndex:0];
73 //// [self.m_data addObject:@"1001"];
74 //// [self.m_data addObject:@"1002"];
75 //// [self.m_data addObject:@"1003"];
76 //// [self.m_data addObject:@"1004"];
77 // // [self.m_data insertObject:[NSArray arrayWithObject:@"01"] atIndex:0];
78 //
79 // );
80 //
81 // dispatch_async(queue, ^(void)
82 //
83 // sleep(2);
84 // dispatch_sync(dispatch_get_main_queue(), ^(void)
85 //
86 // [self.myTableView reloadData];
87 // [self.myTableView scrollToRowAtIndexPath:[indexPath initWithIndex:3] atScrollPosition:UITableViewScrollPositionNone animated:YES];
88 // );
89 // );
90 //
91 //
92 // dispatch_release(queue);
93 // [footSpinnerView release];
94 // [activity release];
95 //
96
97 //如果不是最后一行,则把footerview和headerview都设为nil
98 else
99
100 self.myTableView.tableFooterView = nil;
101 self.myTableView.tableHeaderView = nil;
102
103
参考技术A 采用的EGORefreshTableHeaderView来实现:
在Controller上实现EGORefreshTableHeaderDelegate的delegate

@property(nonatomic)UITableView* tableView;
@property(nonatomic)NSMutableArray* data;
@property(nonatomic)EGORefreshTableHeaderView* refreshTableVIew;
@property(nonatomic,assign)BOOL reloading;

先初始化:
- (void)viewDidLoad

[super viewDidLoad];
// Do any additional setup after loading the view.

UIToolbar* bar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];

UIBarButtonItem* item = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(click)];

[bar setItems:[NSArray arrayWithObjects:item, nil]];
[self.view addSubview:bar];
self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 44,320,460-44)];
[self.view addSubview:_tableView];
self.tableView.delegate = self;
self.tableView.dataSource = self;
_data = [[NSMutableArray alloc] init];
[_data addObject:@"aa"];
[_data addObject:@"cc"];

if (_refreshTableVIew == nil)
EGORefreshTableHeaderView* refreshTableView = [[EGORefreshTableHeaderView alloc] initWithFrame:CGRectMake(0, -self.tableView.bounds.size.height, self.view.frame.size.width, self.tableView.bounds.size.height)];
refreshTableView.delegate = self;
[_tableView addSubview:refreshTableView];
_refreshTableVIew = refreshTableView;




下拉的时候会执行
- (void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView*)view
_reloading = YES;
//开始刷新后执行后台线程,在此之前可以开启HUD或其他对UI进行阻塞
[NSThread detachNewThreadSelector:@selector(doInBackground) toTarget:self withObject:nil];

-(void)doInBackground
NSLog(@"do in background");
[_data addObject:@"ff"];
[NSThread sleepForTimeInterval:3];
[self performSelectorOnMainThread:@selector(loadedTableViewData) withObject:nil waitUntilDone:YES];

-(void)loadedTableViewData
_reloading = NO;
[_refreshTableVIew egoRefreshScrollViewDataSourceDidFinishedLoading:self.tableView];
[self.tableView reloadData];

这个方法表示正在刷新中
- (BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView*)view
return _reloading;

这个方法在显示时间在TableView的刷新块上 :
//返回刷新时间的回调方法
-(NSDate *)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView *)view

return [NSDate date];

然后必须加上下面两个方法:
-(void)scrollViewDidScroll:(UIScrollView *)scrollView

[_refreshTableVIew egoRefreshScrollViewDidScroll:scrollView];


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

[_refreshTableVIew egoRefreshScrollViewDidEndDragging:scrollView];
本回答被提问者和网友采纳
参考技术B

    可以用系统UITableViewController refreshcontrol 进行实现。

    可以继承第三方的类库,如MJRefresh ,类库。

以上是关于IOS怎么实现一个UITableView的下拉刷新的主要内容,如果未能解决你的问题,请参考以下文章

iOS UITableView-下拉刷新上拉加载

iOS UITableView-下拉刷新上拉加载

小程序怎么实现下拉刷新

ios UITableView刷新TableCell问题

IOS学习之UiTableView下拉刷新与自动加载更多,百年不变的效果

android 下拉刷新怎么实现