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一下跟踪代码。看是否正确执行。
如果要查看缓存图片,可以去模拟器的本应用沙盒中查找,目录代码中已有。
浙公网安备 33010602011771号