完全代碼實現UITableView下拉更新,異步請求數據


 

  之前寫了一篇用控件實現自定義UITableViewCell的,個人覺得還是用代碼實現比較好,這樣便於維護,而且重用性高。在網上一搜,完全用代碼創建UITableView的帖子少之又少,大多數人覺得用IB用方便,但是如果你對完全使用代碼創建空間不熟的話,還是建議你用代碼,很熟悉的同學可以忽略。

效果圖:

先做一些准備工作:先去https://github.com/enormego/EGOTableViewPullRefresh/downloads下載下拉更新的類,這個類只有兩個文件,解壓后直接拖到項目中來。記得之后在ViewController.h中導入頭文件#import "EGORefreshTableHeaderView.h",還需要導入一個庫,叫QuartzCore.framework。

還需要下拉箭頭的圖片,還是去http://code4app.com/ios/Pull-To-Refresh-TableView/4f681c096803fa2c63000004

下載那個比較完整的項目吧,然后把下拉箭頭的圖片粘貼過來,大家也可以順便看看那個項目

下拉框架所需要的准備工作就完成了,接下來是圖片異步下載類,下載地址

https://github.com/rs/SDWebImage

這個版本不是最新的,最新的整合成了一個SDWebImage.framework庫文件,我嘗試了很多次導入成功了,但是運行時會報錯,如果有成功運行的同學請告訴我一下哦。

解壓之后把SDWebImage文件夾拖到項目中來,里面一共20個文件。

添加兩個庫:ImageIO.framework和MapKit.framework

如圖把Compiler for C/C++/Objective-C 的屬性改為Apple LLVM compiler 3.0

最后別忘了導入#import "UIImageView+WebCache.h"頭文件

開始寫代碼!

ViewController.h文件 

#import <UIKit/UIKit.h>
#import "EGORefreshTableHeaderView.h"

@interface ViewController : UIViewController<UITableViewDelegate,UITableViewDataSource,EGORefreshTableHeaderDelegate>
{//這里別忘了要導入EGORefreshTableHeaderDelegate這個協議,下拉更新必須要用
    EGORefreshTableHeaderView *_refreshHeaderView;
    BOOL _reloading;
}
@property (retain,nonatomic)NSArray *imageArray;
@property (retain,nonatomic)UITableView *tableViewImage;
- (void)reloadTableViewDataSource;
- (void)doneLoadingTableViewData;
@end

 

ViewController.m文件 ,文中的紅字是下拉部分用到的代碼,綠色文字是異步更新圖片用到的代碼

#import "ViewController.h"
#import "UIImageView+WebCache.h"

@implementation ViewController
@synthesize imageArray;
@synthesize tableViewImage;

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSArray *array = [NSArray arrayWithObjects: @"http://static2.dmcdn.net/static/video/451/838/44838154:jpeg_preview_small.jpg?20120509163826",
                      @"http://static2.dmcdn.net/static/video/656/177/44771656:jpeg_preview_small.jpg?20120509154705",
                      @"http://static2.dmcdn.net/static/video/629/228/44822926:jpeg_preview_small.jpg?20120509181018",
                      @"http://static2.dmcdn.net/static/video/116/367/44763611:jpeg_preview_small.jpg?20120509101749",
                      @"http://static2.dmcdn.net/static/video/340/086/44680043:jpeg_preview_small.jpg?20120509180118",
                      @"http://static2.dmcdn.net/static/video/666/645/43546666:jpeg_preview_small.jpg?20120412153140",
                      @"http://static2.dmcdn.net/static/video/771/577/44775177:jpeg_preview_small.jpg?20120509183230",
                      @"http://static2.dmcdn.net/static/video/810/508/44805018:jpeg_preview_small.jpg?20120508125339",
                      @"http://static2.dmcdn.net/static/video/152/008/44800251:jpeg_preview_small.jpg?20120508103336",
                      @"http://static2.dmcdn.net/static/video/694/741/35147496:jpeg_preview_small.jpg?20120508111445",
                      @"http://static2.dmcdn.net/static/video/988/667/44766889:jpeg_preview_small.jpg?20120508130425",
                      @"http://static2.dmcdn.net/static/video/282/467/44764282:jpeg_preview_small.jpg?20120507130637",
                      @"http://static2.dmcdn.net/static/video/754/657/44756457:jpeg_preview_small.jpg?20120507093012",
                      @"http://static2.dmcdn.net/static/video/831/107/44701138:jpeg_preview_small.jpg?20120506133917",
                      @"http://static2.dmcdn.net/static/video/411/057/44750114:jpeg_preview_small.jpg?20120507014914",
                      @"http://static2.dmcdn.net/static/video/894/547/44745498:jpeg_preview_small.jpg?20120509183004",
                      @"http://static2.dmcdn.net/static/video/082/947/44749280:jpeg_preview_small.jpg?20120507015022",
                      @"http://static2.dmcdn.net/static/video/833/347/44743338:jpeg_preview_small.jpg?20120509183004", nil];
    self.imageArray = array;
    UITableView *tableView = [[[UITableView alloc]initWithFrame:CGRectMake(0, 0, 320, 460) style:UITableViewStylePlain]autorelease];
    tableView.dataSource = self;
    tableView.delegate = self;
    self.tableViewImage = tableView;
    [self.view addSubview:tableViewImage];
    
    if (_refreshHeaderView == nil) {
        EGORefreshTableHeaderView *view =
        [[EGORefreshTableHeaderView alloc]initWithFrame:CGRectMake(0.0f, 0.0f - self.tableViewImage.bounds.size.height, self.view.bounds.size.width, self.tableViewImage.bounds.size.height)];
//注意下拉框的位置描述!要把tableViewImage換成自己定義的tableview!
view.delegate = self; [self.tableViewImage addSubview:view];//這里要把view加到自己定義的tableview上 _refreshHeaderView = view; [view release]; } [_refreshHeaderView refreshLastUpdatedDate];
} #pragma mark -tableview- - (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; } cell.textLabel.text = [NSString stringWithFormat:@"喵星人--%d",indexPath.row]; [cell.imageView setImageWithURL:[NSURL URLWithString:[self.imageArray objectAtIndex:indexPath.row]] placeholderImage:[UIImage imageNamed:@"LittleWhitePig.png"]];
//這句話是SDWebImage類里面的方法,作用是異步加載圖片
//- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder
//其中placeholder是網絡圖片在加載完之前替代它占位的圖片。
return cell; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return [imageArray count]; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ return 80; } #pragma mark -refresh- - (void)reloadTableViewDataSource {
   NSLog(@"==開始加載數據");  [self.tableViewImage reloadData];//這里tableview要reloadData _reloading = YES; } - (void)doneLoadingTableViewData {
   NSLog(@"===加載完數據"); _reloading = NO; [_refreshHeaderView egoRefreshScrollViewDataSourceDidFinishedLoading:self.tableViewImage];//這里要改成自己定義的tableview } #pragma mark - #pragma mark EGORefreshTableHeaderDelegate Methods - (void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView*)view{ [self reloadTableViewDataSource]; [self performSelector:@selector(doneLoadingTableViewData) withObject:nil afterDelay:3.0]; } - (BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView*)view{ return _reloading; // should return if data source model is reloading } - (NSDate*)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView*)view{ return [NSDate date]; // should return date data source was last changed } #pragma mark - #pragma mark UIScrollViewDelegate Methods - (void)scrollViewDidScroll:(UIScrollView *)scrollView{ [_refreshHeaderView egoRefreshScrollViewDidScroll:scrollView]; } - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{ [_refreshHeaderView egoRefreshScrollViewDidEndDragging:scrollView]; }
- (void)viewDidUnload { [super viewDidUnload]; } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; } - (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {   return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); } - (void)dealloc { [self.imageArray release]; [self.tableViewImage release]; _refreshHeaderView = nil; [super dealloc]; } @end

  重點在文中已經注釋出來了,應該很明了,如果有任何問題請給我留言。

 

  今天就這么多,想學好的同學們千萬不要懶,最差的程序猿就是沒完沒了地復制粘貼的那些人,復制粘貼之后你真的就會了嗎?粘貼完之后能自己寫出來嗎?還是下次繼續復制粘貼?這么做永遠都只能保持初級程序員的水平,腦子笨不可怕(我就腦子笨),沒有上進心這輩子就完了!


免責聲明!

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



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