且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

UIcollectionViewCell(UItableviewcell)长按删除操作

更新时间:2021-08-11 13:37:12

功能简单,陷阱不少:
主要涉及两个功能:
1、长按手势:UILongPressGestureRecognizer
2、cell自带的删除操作:deleteItemsAtIndexPaths

首先为cell添加长按手势:

UILongPressGestureRecognizer* longgs=[[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longpress:)];
    [cell addGestureRecognizer:longgs];//为cell添加手势
    longgs.minimumPressDuration=1.0;//定义长按识别时长
    longgs.view.tag=indexPath.row;//将手势和cell的序号绑定
    return  cell;

此处注意 [cell addGestureRecognizer:longgs];和longgs.view.tag=indexPath.row;的位置顺序,不能颠倒,要先绑定手势,再赋值tag,因为longs.view中的view实际上就是手势添加到的视图,如果还没有绑定手势,view实际上是没有的。

然后就是调用的删除功能的函数:

-(void)longpress:(UILongPressGestureRecognizer*)ges{
    if(ges.state==UIGestureRecognizerStateBegan){
       //获取目标cell 
       NSInteger row=ges.view.tag;
        //删除操作
        if(self.cellcount.count>1){
        NSIndexPath *index =[NSIndexPath indexPathForRow:row inSection:0];
        NSArray* deletearr=@[index];
            [self.colview deleteItemsAtIndexPaths:deletearr];
        }else{
            [self.colview reloadData];

        }
    }
}

这里要注意两点:
1、要对state进行判定,如果没判定会出现两次操作。
2、自带的cell删除操作deleteItemsAtIndexPaths在只剩最后一个cell调用时会出现奔溃,所以这里要进行判定,当为最后一个时,直接reloadData。(其实都用reloadData都行,不过调用deleteItemsAtIndexPaths会有一个剩余cell的移动动画)