iOS基础-高级视图-UITableView--实例:app管理

不利用xib而是利用storyboard里的默认动态cell来描述自定义cell
一、在第三个数据源方法中加载cell

{
MJAppCell *cell = [tableView dequeueReusableCellWithIdentifier:@"app"];
//将模型数据传给cell的时候会调用set方法,在set方法中覆盖按钮的数据和状态即可
cell.app = self.apps[indexPath.row]; 
return cell;
}

PS:一个TableView可以备份多种类型的cell,到时候只需要根据不同标识加载cell即可
二、在MJAppCell.h中添加模型数据属性并重写set方法

//这个MJApp是事先准备好直接拖过来的,里面有app的icon,name,size,download属性。 
@property(nonatomic,strong)MJApp *app;
//在set方法中将app的这些属性赋值给cell的相应控件。
-(void)setApp:(MJApp *)app
{
_app = app;
self.iconView.image = [UIImage imageNamed:app.icon];
self.nameView.text = app.name;
self.introView.text = [NSString stringWithFormat:@" 大小: %@ | 下载量:% 
@",app.size,app.download];
}

三、点击下载按钮后显示已下载,并且按钮不能再被点击
1.将Disabled时的文字设置为已下载
2.在MJApp模型中添加一条属性
@property(nonatomic,assign,getter = isDownloaded)BOOL downloaded;
3.监听下载按钮并实现方法

//点击了下载按钮
-(IBAction)downloadClick:(UIButton *)btn{
//让按钮失效
self.app.downloaded = YES;
btn.enabled = NO;

//2.通知代理
}

4.拿到下载按钮,在set方法中覆盖按钮的状态

-(void)setApp:(MJApp *)app
{
   ......
  // 覆盖按钮的状态
  self.downloadView.enabled = (self.app.isDownloaded == NO);
}

5.添加一个下载成功的提示
1>定义协议并遵守协议

@protocol MJAppCellDelegate <NSObject>
@optional
-(void)appCellDidClickedDownloadBtn:(MJAppCell *)cell;
@end
@property (nonatomic,weak) id<MJAppCellDelegate> delegate;

2>在下载按钮的方法中通知代理按钮被点击了

-(IBAction)downloadClick:(UIButton *)btn
{
   ....
  //2.通知代理
  if([self.delegate respondsToSelector:@selector 
  (appCellDidClickedDownloadBtn:)]){
  [self.delegate appCellDidClickedDownloadBtn:self];
   } 
}

3>在第三个数据源方法中将控制器设置为代理,并让控制器遵守代理协议
4>实现cell 的代理方法

PS:什么时候用代理呢?
当一个View内部发生了一些事情,想告诉控制器的时候

posted on 2015-08-26 12:20  Marshall_Yin  阅读(585)  评论(0编辑  收藏  举报