1.项目场景:自定义cell上有一个加入收藏的button,点击button即加入收藏,同时button变为选中状态,变为选中状态时的图片。
2.在你按照正常的思路来写时会发现出现的cell的重用问题。
3.解决方案:我们需要知道3点问题
>1.我们cell上显示数据都是来自于模型,这一点我们通过下面的代码来了解一下
- (void)setModel:(CLNewsModel *)model
{ _model = model; self.dataLable.text = [self.model.sdate substringWithRange:NSMakeRange(5, 5)]; self.stitleLable.text = self.model.stitle; [self.iconView sd_setImageWithURL:[NSURL URLWithString:self.model.imgsrc] placeholderImage:[UIImage imageNamed:@"1"]]; }如果你已经入门,上面的代码你应该能看懂了,这段代码封装在自定义cell内部。我们想让cell显示button的选中和正常的状态,就需要这么来写代码(需求推动开发)- (void)setModel:(CLNewsModel *)model
{ _model = model; self.favriteBtn.selected = self.model.isSelected; // 收藏按钮到底是什么状态由模型的isSelected属性来决定,所以在模型中需要定义一个isSelected属性 self.dataLable.text = [self.model.sdate substringWithRange:NSMakeRange(5, 5)]; self.stitleLable.text = self.model.stitle; [self.iconView sd_setImageWithURL:[NSURL URLWithString:self.model.imgsrc] placeholderImage:[UIImage imageNamed:@"1"]];}>2.点击了收藏按钮,收藏按钮变为选中状态,同时监听按钮的点击
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{ if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { self.dataLable = [[UILabel alloc] initWithFrame:CGRectMake(iconX+iconW+magin, 50, 100, 20)]; self.dataLable.font = [UIFont systemFontOfSize:12]; [self.contentView addSubview:self.dataLable]; self.favriteBtn = [[UIButton alloc] initWithFrame:CGRectMake([UIScreen mainScreen].bounds.size.width-40, 50, 20, 20)]; [self.favriteBtn setBackgroundImage:[UIImage imageNamed:@"funSelected"] forState:UIControlStateNormal]; [self.favriteBtn setBackgroundImage:[UIImage imageNamed:@"fun"] forState:UIControlStateSelected]; [self.favriteBtn addTarget:self action:@selector(clickFav:) forControlEvents:UIControlEventTouchUpInside]; [self.contentView addSubview:self.favriteBtn]; } return self;}// 点击了收藏- (void)clickFav:(UIButton *)btn{ self.model.isSelected = YES; [self.delegate clickFavMakeTableViewReloadData]; // 这是一个代理方法,主要的作用就是刷新tableView。控制器实现该方法,刷新一下tableView即可}
移动端热门技术交流群170229489