美文网首页
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