说起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
网友评论