美文网首页
day10-自定义删除

day10-自定义删除

作者: js_huh | 来源:发表于2020-06-08 12:47 被阅读0次

数据刷新01全局刷新
数据刷新02局部刷新
左滑删除
滑动时自定义多个按钮
单选编辑模式
批量删除


是什么?


  • 为什么需要,鼠标离开了那行cell,才能显示按钮?
    默认的动画模式(UITableViewRowAnimationNone),就是这样得.全局刷新([self.tableView reloadData])采用的就是默认的动画模式.
    将它更改为,局部刷新,且动画模式淡入淡出(UITableViewRowAnimationFade)即可 :
    [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];

  • 问: 系统自带的cell的模式中,有如图所示的模式吗?
    没有,所以只能自定义cell了.

  • 问: 自定义cell是怎么创建得?
    1.创建继承自UITableViewCell的cell
    2.重写initWithStyle: reuseIdentifier :方法.

  • 问: 自定义cell的方法里面,做哪些事情?
    1.自定义cell,在原有的cell的基础上,再添加自己额外的控件
    2.创建带有右侧图片的cell,且将此图片隐藏.

//重写创建cell的方法
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(nullable NSString *)reuseIdentifier{
    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { //在原有cell的基础上,添加自己额外的控件.
        UIImageView * imgTemp = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"check"]];
        imgTemp.hidden = YES;
        [self.contentView addSubview:imgTemp];
        self.checkImageView = imgTemp;
    }
    return self;
}

  • 问: layoutSubviews方法里面做了哪些事情?
    设置cell中子控件的位置.(打钩图片的位置)
//设置子控件的位置
- (void)layoutSubviews{
    [super layoutSubviews];
    //设置'勾选图片'的位置
    CGFloat checkWH = 24;
    CGFloat checkX = self.contentView.frame.size.width - checkWH -10;
    CGFloat checkY = self.contentView.frame.size.height * 0.5 - checkWH* 0.5;
    self.checkImageView.frame = CGRectMake(checkX, checkY, checkWH, checkWH);
    
    //调整cell里内容的宽度
    CGRect textFrame = self.textLabel.frame;
    textFrame.size.width = self.textLabel.frame.size.width - checkWH -10;
    self.textLabel.frame = textFrame;
}

  • 问: 怎么调用创建好的自定义cell?
    tableView: cellForRowAtIndexPath: 方法里面,使用initWithStyle: reuseIdentifier :方法创建cell.

  • 问: 怎么将各个cell的数据,添加到自定义cell里面?
    1.自定义cell里面, 创建个'类型Wine属性',重写setWine方法.
    2.在setWine方法里面,将传递进来的数据,赋值给自定义cell的对应控件.
    3.ViewController里将数据,传递进来.
    initWithStyle: reuseIdentifier :创建自定义cell.
    cell.wine = 数据,调用setWine方法.

  • 问: cell在什么时候,显示/隐藏打钩的图片?
    1.- tableView : didSelectRowAtIndexPath:// 在选中cell的时候.
    2.选中cell的时候,更改'图片显示状态的属性'
    当图片显示状态为Y,则改为N. 状态为N,则改为Y。
    wine.check = !wine.check;


  • 问: 怎么将打钩图片显示出来?
    1.'类型Wine'中要添加一个属性,'图片显示状态的属性'.
    2.在重写的setWine方法中,根据图片的显示状态来显示/隐藏图片控件.
//重写wine,给对应的子控件赋值
-(void)setWine:(Wine *)wine{
    _wine = wine;
    self.textLabel.text = wine.name;
    self.imageView.image = [UIImage imageNamed:wine.image];
    self.detailTextLabel.text = [NSString stringWithFormat:@"¥%@",wine.money];\
    
    if (wine.iSCheck) {//显示打钩图片
        self.checkImageView.hidden = NO;
    }else{ //隐藏打钩图片
        self.checkImageView.hidden = YES;
    }
}

  • 问: 选中行删除怎么实现?
    1.判断'数据源集合'里,哪些'图片显示状态'为Y。
    2.将为Y的类,全部放在临时的可变集合中.
    3.在'数据源集合'里,删除对应的数据。
    [self.wineArray removeObjectsInArray:delArray];
- (IBAction)removeBtn{
    NSMutableArray * delArray = [NSMutableArray array];
    NSArray<NSIndexPath *> *indexPaths;
    for (Wine* wineTemp in self.wineData) {
        if (wineTemp.check) {
            [delArray addObject:wineTemp];
        }
    }
    //'数据源'删除数据
    [self.wineData removeObjectsInArray:delArray];
    //刷新数据列表-全局刷新
    [self.tableView reloadData];
}

注意:

原则:

  • 遍历一个数组时,要保证数组长度不变

    虽然删除的是对象而不是索引。这样写,没有问题.但是不建议这样做.
    推荐: 先用可变数组保存需要删除的cell, 然后,直接删除数组。
  • tableView:中通过修改模型,而去影响界面。
    不要直接修改界面.(因为存在循环利用)
    如: 通过删除数据源里的'数据',而去删除数据所对应的cell

相关文章

网友评论

      本文标题:day10-自定义删除

      本文链接:https://www.haomeiwen.com/subject/qyuhzhtx.html