我想允许在UITableView中的默认行移动,而不会处于编辑模式,并且不会影响UITableView的默认行为.
上图显示编辑模式下的单元格,启用移动.
我试图简单地运行(在UIView * subview在cell.subviews)(当我的UITableView处于编辑模式),但按钮没有出现:
<UITableViewCellScrollView: 0x8cabd80; frame = (0 0; 320 44); autoresize = W+H; gestureRecognizers = <NSArray: 0x8c9ba20>; layer = <CALayer: 0x8ca14b0>; contentOffset: {0,0}>
如何允许/添加移动“按钮”而不启用我的UITableView中的编辑模式?
解决方法
我实际上为我的一个应用程序做了类似的事情.它使用委托方法进行表格编辑,并使用户“欺骗”一点. 100%内置苹果功能.
1 – 将表设置为编辑(我在viewWillAppear中执行)
-(void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; [self.tableView setEditing:YES]; }
2 – 隐藏默认附件图标:
-(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{ //remove any editing accessories (AKA) delete button return UITableViewCellAccessoryNone; }
3 – 保持编辑模式,将所有内容移动到右侧(在单元格中)
-(BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath{ return NO; }
4 – 在这一点上,您应该可以拖动单元格,而不是看起来像编辑模式.在这里我们欺骗用户.创建自己的“移动”图标(默认情况下三行,您想要的任何图标),并将imageView正确放置在单元格上.
5 – 最后,实现委托方法来实际重新排列你的底层数据源.
-(void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath{ //Get original id NSMutableArray *originalArray = [self.model.items objectAtIndex:sourceIndexPath.section]; Item * original = [originalArray objectAtIndex:sourceIndexPath.row]; //Get destination id NSMutableArray *destinationArray = [self.model.items objectAtIndex:destinationIndexPath.section]; Item * destination = [destinationArray objectAtIndex:destinationIndexPath.row]; CGPoint temp = CGPointMake([original.section intValue],[original.row intValue]); original.row = destination.row; original.section = destination.section; destination.section = @(temp.x); destination.row = @(temp.y); //Put destination value in original array [originalArray replaceObjectAtIndex:sourceIndexPath.row withObject:destination]; //put original value in destination array [destinationArray replaceObjectAtIndex:destinationIndexPath.row withObject:original]; //reload tableview smoothly to reflect changes dispatch_async(dispatch_get_main_queue(),^{ [UIView transitionWithView:tableView duration:duration options:UIViewAnimationOptionTransitionCrossDissolve animations:^{ [tableView reloadData]; } completion:NULL]; }); }