生活随笔
收集整理的這篇文章主要介紹了
iOS 下拉刷新
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
移動應用開發中有這么一種場景,就是在列表中顯示的數據刷新,有點擊刷新按鈕刷新的,也有現在最流行的由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的協議,接下來上代碼,代碼中有詳細的注釋說明。
[cpp]?view plaincopy
<span?style="font-family:Comic?Sans?MS;font-size:18px;">#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</span>??
[cpp]?view plaincopy
#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;?? ?????????? ????????[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;?? ?????? ????[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];?? ?????? ?????? ????[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 ?
轉載于:https://www.cnblogs.com/yuhaojishuboke/p/5043106.html
總結
以上是生活随笔為你收集整理的iOS 下拉刷新的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。