默認的側滑
實現以下方法,則可以得到默認的側滑刪除。並且在該方法處理點擊事件。
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { [self.dataArray removeObjectAtIndex:indexPath.row]; [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; }
得到以下效果:
default delete.png
修改標題
如果想要改變按鈕的問題,重寫以下方法設置即可:
- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath { return @"返回"; }
backTitle.png
側滑顯示多個按鈕
在iOS 8 之后,可以實現以下方法,可以得到多個按鈕,每個按鈕都是固定的寬度,設置太多會超出屏幕。而且,在block中處理不同按鈕的點擊事件。
- (NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewRowAction *editAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleNormal title:@"編輯" handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) { // 收回側滑 [tableView setEditing:NO animated:YES]; }]; UITableViewRowAction *deleteAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDestructive title:@"刪除" handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) { // 刪除cell: 必須要先刪除數據源,才能刪除cell [self.dataArray removeObjectAtIndex:indexPath.row]; [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; }]; return @[deleteAction, editAction, deleteAction, editAction]; }
multiTitle.png
editAction.backgroundColor = [UIColor yellowColor];
其中,如果設置了UITableViewRowAction的背景顏色,則顯示用戶設置的。否則顯示系統默認的,Destructive是紅色,Normal 是淺灰色。
按鈕顯示圖標
有一個取巧的方法,可以用平鋪的圖片設置成UITableViewRowAction的backgroundColor, 但是這個圖標需要大一點,不然就會被平鋪了。
UIImage *image = [UIImage imageNamed:@"account_item_me"]; editAction.backgroundColor = [UIColor colorWithPatternImage:image];
bigImage.png
smallImage.png
iOS 11 之后,新增了兩個方法, 可以直接設置圖標。trailingSwipe是左滑,顯示右側菜單。leadingSwipe是右
滑,顯示左側菜單。
- (UISwipeActionsConfiguration *)tableView:(UITableView *)tableView trailingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath { if (@available (iOS 11, *)) { UIContextualAction *deleteAction = [UIContextualAction contextualActionWithStyle:UIContextualActionStyleDestructive title:@"刪除" handler:^(UIContextualAction * _Nonnull action, __kindof UIView * _Nonnull sourceView, void (^ _Nonnull completionHandler)(BOOL)) { if (self.dataArray.count > indexPath.row) { [self.dataArray removeObjectAtIndex:indexPath.row]; [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; } completionHandler(YES); }]; deleteAction.image = [UIImage imageNamed:@"public_system_success"]; UIContextualAction *backAction = [UIContextualAction contextualActionWithStyle:UIContextualActionStyleNormal title:nil handler:^(UIContextualAction * _Nonnull action, __kindof UIView * _Nonnull sourceView, void (^ _Nonnull completionHandler)(BOOL)) { // 不做任何事 [tableView setEditing:NO animated:YES]; completionHandler(YES); }]; backAction.image = [UIImage imageNamed:@"public_system_success"]; UISwipeActionsConfiguration *configuration = [UISwipeActionsConfiguration configurationWithActions:@[deleteAction, backAction]]; return configuration; } return nil; }
但是不知道哪里出錯了,沒有正確地顯示圖標,而是出現了白色圓圈。其實,應該是顯示跟Cell左側一樣的圖標才對。如果圖片太大的話,還會將其他的菜單給覆蓋了。
strangeWhiteImage.png
右滑,顯示左側的菜單,跟左滑的一樣。
- (UISwipeActionsConfiguration *)tableView:(UITableView *)tableView leadingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath { UIContextualAction *editAction = [UIContextualAction contextualActionWithStyle:UIContextualActionStyleNormal title:@"編輯" handler:^(UIContextualAction * _Nonnull action, __kindof UIView * _Nonnull sourceView, void (^ _Nonnull completionHandler)(BOOL)) { // 不做任何事,只是收回側滑 [tableView setEditing:NO animated:YES]; completionHandler(YES); }]; editAction.backgroundColor = [UIColor greenColor]; UISwipeActionsConfiguration *configuration = [UISwipeActionsConfiguration configurationWithActions:@[editAction]]; return configuration; }
