UITableview 上提刷新


最近做的項目中用到了列表,數據是要從webservice請求,網絡是通過3G或者Wifi來連接,所以決定采用分頁加載方式下載數據。

從網上找到的資料,基本思路就是在Tableview的末尾,也就是contentview(Tableview本身繼承與Scrollview)的末尾,加一個footview,用來顯示:“上拉加載更多數據”、“加載中“、"松開即加載數據"。

這里個人認為比較重要的思想就是tableview與footview之間的交互。分以下三個步驟吧:

 

1.tableview需要通知footview的事情包括滑動,還有滑動結束。

2.footview對於滑動的相應:詢問tableview是否正在加載更多數據,更新顯示的標題。

3.footview對於滑動結束的相應:通知tableview的控制器是否加載更多數據。

4.tableview加載更多數據去,加載完畢再回頭通知footview

 

不知這樣說能否明白,我暫時是這么理解的。下面根據1-3步驟來說下代碼。

要實現步驟1:

/*TableViewController.m*/
//UIScrollViewDeleagete Methods
1 - (void)scrollViewDidScroll:(UIScrollView *)scrollView
2 {        
3     [footview RefreshScrollViewDidScroll:scrollView];//只要滑動就會觸發,這時候要通知footview
4 }
5 
6 - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
7 {
8     [footview RefreshScrollViewDidEndDragging:scrollView];//滑動結束,通知footview    
9 }
//這段代碼是tableview的控制器中,要實現通知footview滑動消息的兩個委托方法。

 

footview得知滑動消息后,要作出反應。

實現步驟2:

//Footview.m
 1 //手指屏幕上不斷拖動調用此方法
 2 - (void)RefreshScrollViewDidScroll:(UIScrollView *)scrollView {    
 3     
 4     if (_state == PullRefreshLoading) {//footview顯示“正在加載”狀態
 5         
 6         CGFloat offset = MAX(scrollView.contentOffset.y * -1, 0);
 7         offset = MIN(offset, 60);
 8         scrollView.contentInset = UIEdgeInsetsMake(0.0, 0.0f, RefreshViewHight, 0.0f);//將表格數據提上去,為footview騰出空間
 9         
10     } else if (scrollView.isDragging) {//拖動,但是沒有松開,這個時候需要根據拖動的距離顯示"上拉加載更多數據"或者“松開即可加載更多”
11         
12         BOOL _loading = NO;
13         if ([_delegate respondsToSelector:@selector(egoRefreshTableHeaderDataSourceIsLoading:)]) {
14             _loading = [_delegate RefreshTableHeaderDataSourceIsLoading:self];//從tableview獲取是不是正在加載更多數據,如果是的話,那么footview將不做出反應,也就是說,保證每次只加載一次數據
15         }
16         
17         if (_state == EGOOPullRefreshPulling && scrollView.contentOffset.y + (scrollView.frame.size.height) < scrollView.contentSize.height + RefreshViewHight && scrollView.contentOffset.y > 0.0f && !_loading) {
18             [self setState:PullRefreshNormal];//footview顯示"上拉將加載更多"
19         } else if (_state == EGOOPullRefreshNormal && scrollView.contentOffset.y + (scrollView.frame.size.height) > scrollView.contentSize.height + RefreshViewHight  && !_loading) {
20             [self setState:PullRefreshPulling];//footview顯示"松開即加載更多"
21         }
22         
23         if (scrollView.contentInset.bottom != 0) {//將表格恢復,將看不到footview
24             scrollView.contentInset = UIEdgeInsetsZero;
25         }
26         
27     }
28     
29 }
步驟3.

32 //當用戶停止拖動,並且手指從屏幕中拿開的的時候調用此方法
33 - (void)RefreshScrollViewDidEndDragging:(UIScrollView *)scrollView {
34     
35     BOOL _loading = NO;
36     if ([_delegate respondsToSelector:@selector(RefreshTableHeaderDataSourceIsLoading:)]) {
37         _loading = [_delegate RefreshTableHeaderDataSourceIsLoading:self];//詢問tableview是否正在加載數據
38     }
39     //如果拖動的距離大於footview的高度,並且沒有正在加載數據
40     if (scrollView.contentOffset.y + (scrollView.frame.size.height) > scrollView.contentSize.height + RefreshViewHight && !_loading) {
41         
42         if ([_delegate respondsToSelector:@selector(egoRefreshTableHeaderDidTriggerRefresh:)]) {
43             [_delegate RefreshTableHeaderDidTriggerRefresh:self];//通知tableview去加載更多數據
44         }
45         
46         [self setState:PullRefreshLoading];//footview狀態更改為”正在加載“
47         [UIView beginAnimations:nil context:NULL];
48         [UIView setAnimationDuration:0.2];
49         scrollView.contentInset = UIEdgeInsetsMake(0.0f, 0.0f, RefreshViewHight, 0.0f);
50         [UIView commitAnimations];
51         
52     }
53 }   
步驟4.

//tableview.m 實現的footview要求的協議方法
 1 - (void)RefreshTableHeaderDidTriggerRefresh:(RefreshTableHeaderView*)view{
 2     
 3     [self reloadTableViewDataSource];//加載數據
 4     [self performSelector:@selector(doneLoadingTableViewData) withObject:nil afterDelay:4.0];//加載完畢
 5     
 6 }
 7 
 8 - (BOOL)RefreshTableHeaderDataSourceIsLoading:(RefreshTableHeaderView*)view{
 9     
10     return _reloading; // should return if data source model is reloading
11     
12 }
 1 - (void)reloadTableViewDataSource{
 2     
 3     //  在這里加載更多數據
 4     //  put here just for demo
 5     _reloading = YES;
 6     
 7 }
 8 
 9 - (void)doneLoadingTableViewData{
10     
11     //  model should call this when its done loading
12     _reloading = NO;
13     [_refreshHeaderView egoRefreshScrollViewDataSourceDidFinishedLoading:self.tableView];//加載完畢后通知footview
14     
15 }

這樣描述下來可能比較抽象,總結一下:

footview要做的事情:

從tableview索取滑動信息,更新自己的狀態;(“上拉更新數據”,“松開即加載數據”)

從tableview索取滑動信息,如果需要更新,那么更新自己狀態(“正在加載數據”),再通知tableview去更新數據;

從tableview獲取加載完畢的消息,更新自己狀態(“上拉提取更多數據")

tableview要做的事情:

通知footview滑動的信息;

被通知加載數據;

 

參考代碼在這里:

http://www.cocoachina.com/bbs/job.php?action=download&aid=26207


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM