IOS學習筆記34—EGOTableViewPullRefresh實現下拉重新整理

來源:互聯網
上載者:User

行動裝置 App開發中有這麼一種情境,就是在列表中顯示的資料重新整理,有點擊重新整理按鈕重新整理的,也有現在最流行的由Twitter首先推出的下拉重新整理功能,在IOS中,使用下拉重新整理更新UITableView中的資料也用的非常多,最典型的就是新浪微博的用戶端,使用下拉的形式來更新最新的微博資訊。

在Android開發中,有相應的開源項目來實現下拉重新整理,這裡主要講如何在IOS中實現下拉重新整理的功能,我們用到一個EGOTableViewPullRefresh的開源項目來實現這個功能,收先到這裡下載源碼,下載完成后里面有個Demo是可以直接啟動並執行Xcode工程,然後就是這個開源項目的源碼,學習如何使用可以參照Demo,我以下實現的這個是在Demo的基礎上進行了一定的修改,主要是支援了中英文版本,原生的只支援英文,我添加了中英文支援,然後就是重新整理時間的格式,修改後的格式更直觀,原生的是使用SDK內建的時間格式,而我改成了自訂的形式。

首先來看看工程目錄結構:


載入源碼到工程中的方式我就不贅述了,然後我建立了一個MainViewController來作為主介面控制器,配有相應的xib檔案。EGOTableViewPullRefresh檔案夾下是開源項目的源碼,Supporting Files分組下的Localizable.strings是做國際化的檔案,支援中英文,這個檔案就是支援下拉重新整理中英文顯示的國際化資源檔。

國際化是指隨著手機語言的切換,軟體的文字語言也隨著切換,我這裡只支援中英文,所以只建了一個English和一個Chinese的檔案。關於如何在IOS中使用國際化,首先在工程中建立檔案,選擇Resouces然後選擇Strings File類型的檔案,建立成功後,選中該檔案,在右邊屬性選取器中添加語言支援,如:


點擊+號選擇相應的語言就行,完成後就出現了兩個子檔案,分別對應中文和英文,在這些檔案裡面是以索引值對的方式來標示需要國際化的內容:

英文:

"loading" = "Loading...";

中文:

"loading" = "載入中...";

左邊是鍵,右邊是值,注意一定要以“分號”結尾,否則無法識別該索引值對。

在代碼中的使用方式:

NSString *loadingString = NSLocalizedString(@"loading", @"");

第一個參數是擷取內容的鍵,第二個是如果找不到該鍵對應的值,則取第二個參數對應的預設值。
在Android中,也是使用兩個strings.xml檔案來進行國際化,相比Android,IOS中國際化檔案要精簡些。

接下來就看如何使用該下拉重新整理的開源項目,先看看最後實現的效果:

                                             

                                                   

開啟MainViewController.xib檔案然後拖入一個UITableViewController並串連DataSource和Delegate,然後在MainViewController.h檔案中聲明UITableView的協議,接下來上代碼,代碼中有詳細的注釋說明。

#import <UIKit/UIKit.h>#import "EGORefreshTableHeaderView.h"@interface MainViewController : UITableViewController<UITableViewDelegate,UITableViewDataSource,EGORefreshTableHeaderDelegate>{    EGORefreshTableHeaderView *_refreshTableView;    BOOL _reloading;}@property (strong,nonatomic) NSArray *array;//開始重新載入時調用的方法- (void)reloadTableViewDataSource;//完成載入時調用的方法- (void)doneLoadingTableViewData;@end


#import "MainViewController.h"@interface MainViewController ()@end@implementation MainViewController@synthesize array = _array;#pragma mark -#pragma mark View life cycle-(void)viewDidLoad{    [super viewDidLoad];        //設定導航條標題    self.navigationItem.title = @"Pull Refresh";        if (_refreshTableView == nil) {        //初始化下拉重新整理控制項        EGORefreshTableHeaderView *refreshView = [[EGORefreshTableHeaderView alloc] initWithFrame:CGRectMake(0.0f, 0.0f - self.tableView.bounds.size.height, self.view.frame.size.width, self.tableView.bounds.size.height)];        refreshView.delegate = self;        //將下拉重新整理控制項作為子控制項添加到UITableView中        [self.tableView addSubview:refreshView];        _refreshTableView = refreshView;    }        //初始化用於填充表格的資料    NSArray *dataArray = [NSArray arrayWithObjects:@"Ryan",@"Vivi", nil];    self.array = dataArray;        //重新載入表格式資料    [self.tableView reloadData];    }-(void)viewDidUnload{    [super viewDidUnload];    _refreshTableView = nil;}- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{    return (interfaceOrientation == UIInterfaceOrientationPortrait);}# pragma mark -# pragma mark UITableViewDataSource Methods-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{    return 10;}-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{    return [self.array count];}//帶頭標題的表格設定標題方法-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{    return [NSString stringWithFormat:@"Title %d",section + 1];}-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{    static NSString *CellIdentifier = @"CellIdentifier";    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];        if (!cell) {        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];    }        cell.textLabel.text = [self.array objectAtIndex:indexPath.row];        return cell;}#pragma mark -#pragma mark Data Source Loading / Reloading Methods//開始重新載入時調用的方法- (void)reloadTableViewDataSource{_reloading = YES;    //開始重新整理後執行後台線程,在此之前可以開啟HUD或其他對UI進行阻塞    [NSThread detachNewThreadSelector:@selector(doInBackground) toTarget:self withObject:nil];}     //完成載入時調用的方法- (void)doneLoadingTableViewData{    NSLog(@"doneLoadingTableViewData");    _reloading = NO;[_refreshTableView egoRefreshScrollViewDataSourceDidFinishedLoading:self.tableView];    //重新整理表格內容    [self.tableView reloadData];}#pragma mark -#pragma mark Background operation//這個方法運行於子線程中,完成擷取重新整理資料的操作-(void)doInBackground{    NSLog(@"doInBackground");        NSArray *dataArray2 = [NSArray arrayWithObjects:@"Ryan2",@"Vivi2", nil];    self.array = dataArray2;    [NSThread sleepForTimeInterval:3];        //後台操作線程執行完後,到主線程更新UI    [self performSelectorOnMainThread:@selector(doneLoadingTableViewData) withObject:nil waitUntilDone:YES];}#pragma mark -#pragma mark EGORefreshTableHeaderDelegate Methods//下拉被觸發調用的委託方法-(void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView *)view{    [self reloadTableViewDataSource];}//返回當前是重新整理還是無重新整理狀態-(BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView *)view{    return _reloading;}//返回重新整理時間的回調方法-(NSDate *)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView *)view{    return [NSDate date];}#pragma mark - #pragma mark UIScrollViewDelegate Methods//滾動控制項的委託方法-(void)scrollViewDidScroll:(UIScrollView *)scrollView{    [_refreshTableView egoRefreshScrollViewDidScroll:scrollView];}-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{    [_refreshTableView egoRefreshScrollViewDidEndDragging:scrollView];}@end

以上就實現了現在比較流行的下拉重新整理功能,以上只是實現了一個現實需求中的架構,使用中根據業務需求添加功能就可以了。


代碼:下載

加入我們的QQ群或公眾帳號請查看:Ryan's
zone公眾帳號及QQ群

歡迎關注我的新浪微博和我交流:@唐韌_Ryan

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.