EGOTableViewPullRefresh實現下拉刷新

移動應用開發中有這麼一種場景,就是在列表中顯示的數據刷新,有點擊刷新按鈕刷新的,也有如今最流行的由Twitter首先推出的下拉刷新功能,在IOS中,使用下拉刷新更新UITableView中的數據也用的很是多,最典型的就是新浪微博的客戶端,使用下拉的形式來更新最新的微博信息。git

在Android開發中,有相應的開源項目來實現下拉刷新,這裏主要講如何在IOS中實現下拉刷新的功能,咱們用到一個EGOTableViewPullRefresh的開源項目來實現這個功能,收先到這裏下載源碼,下載完成後裏面有個Demo是能夠直接運行的Xcode工程,而後就是這個開源項目的源碼,學習如何使用能夠參照Demo,我如下實現的這個是在Demo的基礎上進行了必定的修改,主要是支持了中英文版本,原生的只支持英文,我添加了中英文支持,而後就是刷新時間的格式,修改後的格式更直觀,原生的是使用SDK自的時間格式,而我改爲了自定義的形式。github

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


加載源碼到工程中的方式我就不贅述了,而後我新建了一個MainViewController來做爲主界面控制器,配有相應的xib文件。EGOTableViewPullRefresh文件夾下是開源項目的源碼,Supporting Files分組下的Localizable.strings是作國際化的文件,支持中英文,這個文件就是支持下拉刷新中英文顯示的國際化資源文件。框架

國際化是指隨着手機語言的切換,軟件的文字語言也隨着切換,我這裏只支持中英文,因此只建了一個English和一個Chinese的文件。關於如何在IOS中使用國際化,首先在工程中新建文件,選擇Resouces而後選擇Strings File類型的文件,建立成功後,選中該文件,在右邊屬性選擇器中添加語言支持,以下圖:ide


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

英文:atom

"loading" = "Loading...";spa

中文:線程

"loading" = "加載中...";3d

左邊是鍵,右邊是值,注意必定要以「分號」結尾,不然沒法識別該鍵值對。


在代碼中的使用方式:

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


以上就實現瞭如今比較流行的下拉刷新功能,以上只是實現了一個現實需求中的框架,使用中根據業務需求添加功能就能夠了。


轉載自http://cache.baiducontent.com/c?m=9d78d513d9d431a94f999e690c66c0176d43f1632ba6d2020ca28449e3732a315015e3ac51200775d3d27d1716df4e4b9bf62173474573e7c59f9f4badffc97f6a9c60742e13dc0754910eaeb85b38917ecd0ffeaf6eb6fba66e84aea58f88124e8c00592fc0a7d758010×××fb64f60bdf1841e421943e1b37178fa52712a9d244a&p=b43ec45b86cc41a95db8c7710f569f&newp=882a9543d38057eb43f5c7710f649f231610db2151d7d1103cc2d7538b&user=baidu&fm=sc&query=%B4%F8%CF%C2%C0%AD%CB%A2%D0%C2%B5%C4tableview&qid=&p1=8

相關文章
相關標籤/搜索