首先,为三方的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 = [NSMutableArrayarray];
//遍历数据源数组;
for(NSIntegeri =0; i
{//在这里是因为需要在排序模式下每一行的文字都需要能单独排序,
//所以在进入排序模式的时候对数据源做了一些处理。
RTModel*model =self.data[i];
if(model.title.length) {//判断数组对应位置的对象是不是文本属性;
//对应位置是字符串需要进行处理;
NSString*strA = model.title;
while([strArangeOfString:@"\n"].length) {//存在\n;
NSRangerange= [strArangeOfString:@"\n"];
NSString*subStr = [strAsubstringToIndex:range.location];
//加入数组;
RTModel*newModel = [[RTModelalloc]init];
newModel.title= subStr;
[arrayMaddObject:newModel];
strA = [strAsubstringFromIndex:range.length+range.location];
}
//最后剩余的字符串不存在换行,所以需要单独添加。
RTModel*lastModel = [[RTModelalloc]init];
lastModel.title= strA;
[arrayMaddObject:lastModel];
}
}else{//不是文本属性直接加入的可变数组
[arrayMaddObject:model];
}
}
//改变数据数组;
self.data= arrayM.copy;
self.isMove=YES;
[_tableViewreloadData];
_tableView.isMove=YES;
}
在控制器的代理方法中刷新tableview,使cell的高度根据是否处于排序状态来返回固定值或者其他。
- (CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath{
RTModel*model =self.data[indexPath.row];
UIFont*font = [UIFontsystemFontOfSize:15];
NSDictionary*attribute =@{NSFontAttributeName: font};
CGSizesize =CGSizeMake([UIScreenmainScreen].bounds.size.width,0);
CGSizeretSize = [model.titleboundingRectWithSize:size
options:\
NSStringDrawingTruncatesLastVisibleLine|
NSStringDrawingUsesLineFragmentOrigin|
NSStringDrawingUsesFontLeading
attributes:attribute
context:nil].size;
CGFloath = retSize.height+40;
//这里的高度计算纯粹为了演示,请按自己的需求返回。
returnself.isMove?40: h ;
}
同理,在tableview的拖拽完成的代理方法里面将isMove的值改为no,继续刷新tableview。
- (void)cellDidEndMovingInTableView:(RTDragCellTableView*)tableView {
{
/*
在这里,如果不对数据源做处理排序完成后每一行文字就是一个cell,都会附带排序按钮,感觉上不是很好。
所以,在这里将相邻的cell模型如果是文字的内容就进行了合并,并在中间添加了“\n”使相邻的文本的cell成为一个cell。
*/
#pragma mark -- 移动完成后合并相邻的文字输入;
NSMutableArray*arrayM = [NSMutableArrayarray];
for(NSIntegeri =0; i
RTModel*model =self.data[i];
if(model.title.length) {
NSString*strNew = model.title;
while(++i
RTModel*nextModel =self.data[i];
strNew = [NSStringstringWithFormat:@"%@\n%@",strNew,nextModel.title];
}
RTModel*newModel = [[RTModelalloc]init];
newModel.title= strNew;
[arrayMaddObject:newModel];
}else{//不是文本输入直接加入到新的可变数组;
[arrayMaddObject:model];
i ++;
}
}
self.data= arrayM.copy;
}
self.isMove=NO;
[_tableViewreloadData];
_tableView.isMove=NO;
}
本文介绍了如何在Python的TableView中实现双击排序功能。通过添加一个isMove标志,判断是否处于排序状态。当点击cell中的按钮时,通过代理切换到排序模式。在排序模式下,对数据源进行处理,使每个单元格的文字可以单独排序。同时,实现了长按手势的响应,完成拖拽排序后,自动合并相邻的文本单元格并更新数据源。
774

被折叠的 条评论
为什么被折叠?



