iOS – 在“UITableView”中允许默认的行移动,而不需要编辑模式

前端之家收集整理的这篇文章主要介绍了iOS – 在“UITableView”中允许默认的行移动,而不需要编辑模式前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想允许在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中的编辑模式?

创建和添加具有默认运动功能的UIButton也是一种选择.

解决方法

我实际上为我的一个应用程序做了类似的事情.它使用委托方法进行表格编辑,并使用户“欺骗”一点. 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];
    });
 }

猜你在找的iOS相关文章