滑动不加载,在ios中非常常用,是优化界面的一种方法,今天给大家分享一下,废话不多说,直接上代码!!
第一步,先在controller中添加一个tableView并实现其代理方法。
第二步,创建一个模型,声明两个属性,
@property(nonatomic,copy)NSString*picUrl; //图片
@property(nonatomic,assign)BOOLisLoad;
//是否下载
千万别忘了在.m文件中写上:
- (void)setValue:(id)valueforUndefinedKey:(NSString*)key{
}//防止崩溃
第三步,重写Cell在.h中声明一个方法:
- (void)setImageWithModel:(MZImageModel*)model;
在.m中写实现方法
- (void)setImageWithModel:(MZImageModel*)model
{
if(model ==nil){ //如果模型为空,加载占位图
[self.mainImagesetImage:[UIImageimageNamed:@"14.png"]];
}else{//否则,请求图片
[self.mainImagesd_setImageWithURL:[NSURLURLWithString:model.picUrl]placeholderImage:[UIImageimageNamed:@"14.png"]completed:^(UIImage*image,NSError*error,SDImageCacheTypecacheType,NSURL*imageURL) {
[modelsetIsLoad:YES];//下载
}];
}
}
最后回到Controller中,先声明一个全局的数组并初始化:
_data=
[[NSMutableArrayalloc]init];
因为是个人练习,所用的都是假数据,这个大家就八仙过海吧。
准备好数据后,foin循环
for(NSDictionary*dicinarray) {
MZImageModel*model = [[MZImageModelalloc]init];
[modelsetValuesForKeysWithDictionary:dic];
[modelsetIsLoad:NO];//装到数组中时,先不下载。
[_dataaddObject:model];
}
dispatch_after(dispatch_time(DISPATCH_TIME_NOW,
(int64_t)(3*NSEC_PER_SEC)),dispatch_get_main_queue(),
^{//让tableView准备好后,再显示
[selfloadShowCells];
});
//在这里要说一下,我用的是sdWebImage第三方请求的图片,它的先 从缓存。沙盒。磁盘三级缓存,都没有才从网络请求
//加载可见cell图片是请求数据的
- (void)loadShowCells
{
NSArray*array
= [self.tableindexPathsForVisibleRows];//TableView中,想要什么,就以什么开头
for(NSIndexPath*indexPathinarray) {
//1.获取cell
MZImageCell*cell = [self.tablecellForRowAtIndexPath:indexPath];
MZImageModel*model =_data[indexPath.row];
[cellsetImageWithModel:model];
}
}
这里还用到了scroller的两个方法
- (void)scrollViewDidEndDecelerating:(UIScrollView*)scrollView
{
[selfloadShowCells];//这个方法是,停止滑动时开始加载。
}
- (void)scrollViewDidEndDragging:(UIScrollView*)scrollView willDecelerate:(BOOL)decelerate
{
if(!decelerate) { //滑动时,加载占位图
[selfloadShowCells];
}
}
- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section
{
return_data.count;
}
- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
staticNSString*identifier =@"image";
MZImageCell*cell = [tableViewdequeueReusableCellWithIdentifier:identifier];
if(!cell) {
cell =[[NSBundlemainBundle]loadNibNamed:@"MZImageCell"owner:selfoptions:nil].lastObject;
}
//对cell进行判断
MZImageModel*model =_data[indexPath.row];
if(model.isLoad){
//此时执行这个方法是从缓存中提取的
[cellsetImageWithModel:model];
}else{
//显示占位图
[cellsetImageWithModel:nil];
}
returncell;
}
有啥不对的地方还请大神们,多多指点!!