iOS11 TableView左滑删除无线拉伸

说起TableView的左滑删除,大家都知道用下面几个方法实现。

- (BOOL)tableView:(UITableView*)tableView canEditRowAtIndexPath:(NSIndexPath*)indexPath {

    return YES;

}

- (UITableViewCellEditingStyle)tableView:(UITableView*)tableView editingStyleForRowAtIndexPath:(NSIndexPath*)indexPath {

    return UITableViewCellEditingStyleDelete;

}

- (NSString*)tableView:(UITableView*)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath*)indexPath {

    return @"Delete";

}

- (void)tableView:(UITableView*)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath*)indexPath {

            //执行删除操作

            //TODO    注意先调用删除接口,在执行remove操作,不然可能会崩溃。

             [_dataArray removeObjectAtIndex:indexPath.row];

            [_tableView reloadData];

}

- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath {

    MINISOQAS_InspectionTaskList_TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:inspectionTaskListTableViewCellIdentifier forIndexPath:indexPath];

    //注意在滑动删除时,最好加上_dataArray.count> indexPath.row这个判断,不然也有肯能会闪退

    if(_dataArray.count> indexPath.row) {

        [cellfillDataWithModel:_dataArray[indexPath.row]];

    }

    returncell;

}


但是在iOS11后,TableView左滑删除能无限拉伸,并自动执行commitEditingStyle方法,不能给用户提前给一个提示,可能导致用户一不小心就删除了,解决这个问题需要用到下面一个方法:


- (UISwipeActionsConfiguration*)tableView:(UITableView*)tableView trailingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath*)indexPathAPI_AVAILABLE(ios(11.0)){

    if(@available(iOS11.0, *)) {

        MINISOWeakSelf;

        UIContextualAction*deleteAction = [UIContextualActioncontextualActionWithStyle:UIContextualActionStyleDestructivetitle:@"删除"handler:^(UIContextualAction*_Nonnullaction,__kindofUIView*_NonnullsourceView,void(^_NonnullcompletionHandler)(BOOL)) {

            // 这句很重要,退出编辑,隐藏左滑菜单

            [tableViewsetEditing:NOanimated:YES];


            //删除前先判断下,满不满足删除条件,如果不满足, completionHandler()返回false;该行就不会被删掉

            if(2>1) {

                completionHandler(false);

                [MBProgressHUDshowError:@"不能删除!"];

            }else{

                completionHandler(true);    //删除该行

                //删除前,临时记住所有数据,如果删除失败,可以复原数据

                weakSelf.tempArray= [_dataArray mutableCopy];

                [weakSelf deleteTaskWithIndexPath:indexPath];    //调用删除接口

//                [weakSelf.dataArray removeObjectAtIndex:indexPath.row];    //这句写不写都可以

                [weakSelf.tableViewreloadData];

            }

        }];


        UISwipeActionsConfiguration *actions = [UISwipeActionsConfiguration configurationWithActions:@[deleteAction]];

        // 禁止侧滑无线拉伸

        actions.performsFirstActionWithFullSwipe = NO;

        returnactions;

    }else{

        returnnil;

    }

}

该方法在iOS11之后才会执行,iOS11以前,不会出现左滑无限拉伸的问题,也就用不到了。


iOS11以前滑动删除时,依次执行:canEditRowAtIndexPath、editingStyleForRowAtIndexPath、titleForDeleteConfirmationButtonForRowAtIndexPath、commitEditingStyle

iOS11以后滑动删除时,依次执行:canEditRowAtIndexPath、editingStyleForRowAtIndexPath、trailingSwipeActionsConfigurationForRowAtIndexPath

你可能感兴趣的:(iOS11 TableView左滑删除无线拉伸)