不利用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内部发生了一些事情,想告诉控制器的时候