WQTableViewController 详解

本事例使用开源类库有 SBJSON ASIHTTPRequest WQTableViewController
系统类库有
当前如果不使用 ASIHTTPRequest 不需要引这么多类库
首先引入类库 
WQTableViewController.h // // WQTableViewController.h // lazyTableUpdate // // Created by Bob Wu on 12-5-9. // Copyright (c) 2012年 veex. All rights reserved. // #define KimageKey @"img_url" ///值根据实际情况设置 为数组中每个item中存放图片URL的key名字 #define KidKey @"articleid" ///值根据实际情况设置 为数组中每个item的id 用于缓存之用 #import <UIKit/UIKit.h> @protocol WQTableViewDelegate @required -(void)cellImageDidLoad:(NSIndexPath *)indexPath image:(UIImage *)image; @end @interface WQTableViewController : UIViewController <UIScrollViewDelegate,UITableViewDelegate> { @public id <WQTableViewDelegate> delegate; NSMutableArray *tableDataArray; UITableView *wqTable; } @end

 

WQTableViewController.m


//
//  WQTableViewController.m
//  lazyTableUpdate
//
//  Created by Bob Wu on 12-5-9.
//  Copyright (c) 2012年 veex. All rights reserved.
//


#import "WQTableViewController.h"

@implementation WQTableViewController


//load cell's image

- (void)loadCellImage
{
    NSArray *indexPathsForLoad = [wqTable indexPathsForVisibleRows];
    for (NSIndexPath *item in indexPathsForLoad) {
        NSInteger rowNumberForCell = item.row;
     //获取图片网络地址 NSString *imageStr = [[tableDataArray objectAtIndex:rowNumberForCell] valueForKey:KimageKey];
    //根据图片网络地址创建本地名称保证唯一并一一对应 // NSLog(@"imagestr:%@",imageStr); NSString *imageName = [imageStr stringByReplacingOccurrencesOfString:@"/" withString:@"_"]; // NSLog(@"imagename:%@",imageName); [imageName stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    //图片缓存到本地的路径 NSString *imageDataPath = [NSHomeDirectory() stringByAppendingPathComponent:[@"Library/Caches/" stringByAppendingString:imageName]]; //如果本地不存在此图片,进行网络请求,下载图片 缓存本地 下载完成后执行代理方法,通知cell更新图片 if (![[NSFileManager defaultManager] fileExistsAtPath:imageDataPath]) { NSURL *imageUrl = [NSURL URLWithString:[imageStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; NSData *imageData = [NSData dataWithContentsOfURL:imageUrl]; [imageData writeToFile:imageDataPath atomically:YES]; UIImage *image = [UIImage imageWithData:imageData]; [delegate cellImageDidLoad:item image:image]; } } } #pragma mark - Table View delegate -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { if (!tableView.isDragging && !tableView.isDecelerating) { [self performSelectorInBackground:@selector(loadCellImage) withObject:nil]; } } #pragma mark - Scroll View delegate - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { [self performSelectorInBackground:@selector(loadCellImage) withObject:nil]; } - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { if (!decelerate) { [self performSelectorInBackground:@selector(loadCellImage) withObject:nil]; } } @end

 创建一个ViewController 继承 WQTableViewController 并实现 UITableViewDataSource 与 WQTableViewDelegate协议,因为 WQTableViewController 已经实现了 UITableViewDelegate 故无需再实现

我这里创建一个视图控制器,并在AppDelegate.m中指定为根视图控制器,这里就不写了。

//
//  RootViewController.h
//  TableView
//
//  Created by wei8 on 13-6-1.
//  Copyright (c) 2013年 wei8. All rights reserved.
//

#import <UIKit/UIKit.h>
#import "WQTableViewController.h"
@interface RootViewController : WQTableViewController<UITableViewDelegate,UITableViewDataSource,WQTableViewDelegate>
@property (nonatomic,retain)NSMutableArray *models;
@property (nonatomic,retain)UITableView *tableView;
@end

 

//
//  RootViewController.m
//  TableView
//
//  Created by wei8 on 13-6-1.
//  Copyright (c) 2013年 wei8. All rights reserved.
//

#import "RootViewController.h"
#import "ASIHTTPRequest.h"
#import "ASIFormDataRequest.h"
#import "SBJson.h"
#import "Model.h"

@interface RootViewController ()

@end

@implementation RootViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
        self.models = [NSMutableArray array];
    }
    return self;
}
//WQT代理 方法
-(void)cellImageDidLoad:(NSIndexPath *)indexPath image:(UIImage *)image{

    UITableViewCell *cell = [wqTable cellForRowAtIndexPath:indexPath];
    cell.imageView.image = image;//更新cell中的图片
}
- (void)viewDidLoad
{
    [super viewDidLoad];
    self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 640, 960) style:UITableViewStylePlain];
    _tableView.delegate = self;
    _tableView.dataSource = self;
    [self.view addSubview:_tableView];
    [_tableView release];
//此接口暂不公开,同学可自己找开放接口测试,注意封装json 本例的Model可能不适用,自己定义。WQTableViewController.h文件中定义的宏也需要根据实际声明。 NSString *urlstring = @"接口地址,"; NSURL *url = [NSURL URLWithString:urlstring]; ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; request.delegate = self; [request startAsynchronous]; wqTable = self.tableView; delegate = self; }
//asiformdatarequest 的回调方法 服务器返回的数据在request中 json格式 - (void)requestFinished:(ASIFormDataRequest *)request{ NSString *responseString = [request responseString]; NSDictionary *jsonObjDic = [responseString JSONValue]; NSArray *array = [jsonObjDic objectForKey:@"items"];
  //封闭bean for (NSDictionary *dic in array) { Model *model = [[Model alloc] init]; model.addtime = [dic objectForKey:@"addtime"]; model.articleid = [dic objectForKey:@"articleid"]; model.dec = [dic objectForKey:@"dec"]; model.img_url = [dic objectForKey:@"img_url"]; model.title = [dic objectForKey:@"title"]; model.url = [dic objectForKey:@"url"]; [self.models addObject:model]; [model release]; }
  //把数据赋值给 tableDataArray //WQT中的成员变量 tableDataArray = self.models;
  //重新加载数据 [self.tableView reloadData]; } -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ return 1; } -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ return [_models count]; } -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (nil == cell) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; } Model *model = [_models objectAtIndex:indexPath.row]; cell.textLabel.text = model.title; cell.detailTextLabel.text = model.dec; //以图片的网络地址格式生成本地图片名称 NSString *imageName = [[[tableDataArray objectAtIndex:indexPath.row] valueForKey:KimageKey] stringByReplacingOccurrencesOfString:@"/" withString:@"_"]; NSLog(@"imagename:%@",imageName); // NSString *imageName = [[[tableDataArray objectAtIndex:indexPath.row] valueForKey:KidKey] stringByAppendingString:@".temp"]; //获取本地缓存图片路径 NSString*imageDataPath = [NSHomeDirectory() stringByAppendingPathComponent:[@"Library/Caches/"stringByAppendingString:imageName]]; UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfFile:imageDataPath]];
  if (image) { cell.imageView.image = image; } else { cell.imageView.image = [UIImage imageNamed:@"01.jpg"]; //placeholder为在未加载完成加载图片时显示的默认图片 } return cell; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end

 这里自定义了一个MODEL以封装接口返回的参数 

//
//  Model.h
//  TableView
//
//  Created by wei8 on 13-6-1.
//  Copyright (c) 2013年 wei8. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Model : NSObject
@property (nonatomic,copy)NSString *addtime;
@property (nonatomic,copy)NSString *articleid;
@property (nonatomic,copy)NSString *dec;
@property (nonatomic,copy)NSString *img_url;
@property (nonatomic,copy)NSString *title;
@property (nonatomic,copy)NSString *url;
@end

 

//
//  Model.m
//  TableView
//
//  Created by wei8 on 13-6-1.
//  Copyright (c) 2013年 wei8. All rights reserved.
//

#import "Model.h"

@implementation Model

@end

 感兴趣的同学可以打断点或者NSLOG一下跟踪代码。看是否正确执行。

如果要查看缓存图片,可以去模拟器的本应用沙盒中查找,目录代码中已有。

 

 

posted @ 2013-06-01 21:13  wei8  阅读(257)  评论(0)    收藏  举报