关于tableView点击cell中按钮进入排序模式(cell行高统一可长按排序)

十年热恋 提交于 2019-12-10 15:35:13

RTDragCellTableView:  https://github.com/RustedBigB/RTDragCellTableView

首先,为三方的tableview类添加了一个isMove的BOOL属性,用于标记是否处于排序状态。

在三方tableview类里的长按的方法里判断isMove的值。如果不是排序状态直接return。

if (!self.isMove) {

        return;

    }

为自定义的cell声明一个代理,在点击cell中的按钮时,使用代理改变tableview的isMove的值,使tableview进入排序状态。

- (void)myTableViewCell:(MyTableViewCell *)cell funcBtnDidClick:(UIButton *)func {

#pragma mark -- 改变数据源数组;

     NSMutableArray *arrayM = [NSMutableArray array];

    //遍历数据源数组;

    for (NSInteger i = 0; i < self.data.count; i ++) {

        {//在这里是因为需要在排序模式下每一行的文字都需要能单独排序,

//所以在进入排序模式的时候对数据源做了一些处理。

        RTModel *model = self.data[i];

        if (model.title.length) {//判断数组对应位置的对象是不是文本属性;

            //对应位置是字符串需要进行处理;

            NSString *strA = model.title;

            while ([strA rangeOfString:@"\n"].length) {//存在\n;

                NSRange range= [strA rangeOfString:@"\n"];

                NSString *subStr = [strA substringToIndex:range.location];

                //加入数组;

                RTModel *newModel = [[RTModel alloc]init];

                newModel.title = subStr;

                [arrayM addObject:newModel];

                strA = [strA substringFromIndex:range.length+range.location];

            }

            //最后剩余的字符串不存在换行,所以需要单独添加。

            RTModel *lastModel = [[RTModel alloc]init];

            lastModel.title = strA;

            [arrayM addObject:lastModel];

}            

        }else {//不是文本属性直接加入的可变数组

            [arrayM addObject:model];

        }

    }

    //改变数据数组;

     self.data = arrayM.copy;

    self.isMove = YES;

    [_tableView reloadData];

    _tableView.isMove = YES;

}

在控制器的代理方法中刷新tableview,使cell的高度根据是否处于排序状态来返回固定值或者其他。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{

    RTModel *model = self.data[indexPath.row];

    UIFont *font = [UIFont systemFontOfSize:15];

    NSDictionary *attribute = @{NSFontAttributeName: font};

    CGSize size = CGSizeMake([UIScreen mainScreen].bounds.size.width, 0);

    CGSize retSize = [model.title boundingRectWithSize:size

                                             options:\

                      NSStringDrawingTruncatesLastVisibleLine |

                      NSStringDrawingUsesLineFragmentOrigin |

                      NSStringDrawingUsesFontLeading

                                          attributes:attribute

                                             context:nil].size;

    CGFloat h = retSize.height + 40;

//这里的高度计算纯粹为了演示,请按自己的需求返回。

    return self.isMove ? 40 : h ;

}

同理,在tableview的拖拽完成的代理方法里面将isMove的值改为no,继续刷新tableview。

- (void)cellDidEndMovingInTableView:(RTDragCellTableView *)tableView {

{

/*

在这里,如果不对数据源做处理排序完成后每一行文字就是一个cell,都会附带排序按钮,感觉上不是很好。

所以,在这里将相邻的cell模型如果是文字的内容就进行了合并,并在中间添加了“\n”使相邻的文本的cell成为一个cell。

*/

#pragma mark -- 移动完成后合并相邻的文字输入;

    NSMutableArray *arrayM = [NSMutableArray array];

    for (NSInteger i = 0; i < self.data.count; ) {

        RTModel *model = self.data[i];

        if (model.title.length) {

            NSString *strNew = model.title;

            while (++i < self.data.count&&[self.data[i] title].length) {

                RTModel *nextModel = self.data[i];

                strNew = [NSString stringWithFormat:@"%@\n%@",strNew,nextModel.title];

            }

            RTModel *newModel = [[RTModel alloc]init];

            newModel.title = strNew;

            [arrayM addObject:newModel];

            

        }else {//不是文本输入直接加入到新的可变数组;

            [arrayM addObject:model];

            i ++;

        }

    }

    self.data = arrayM.copy;

}

    self.isMove = NO;

    [_tableView reloadData];

    _tableView.isMove = NO;

}

 

http://git.oschina.net/ruiruiheshui/RTDragCellTableView_test

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!