iOS UITableView的编辑模式

特别声明:文章多为网络转载,资源使用一般不提供任何帮助,特殊资源除外,如有侵权请联系!

一.左滑删除

#pragma mark - UITableViewDelegate
/**
 *  只要实现这个方法,就拥有左滑删除功能
 *  点击左滑出现的Delete按钮 会调用这个
 */
//- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
//{
//    NSLog(@"commitEditingStyle--");
//    [self.wineArray removeObjectAtIndex:indexPath.row];
//    [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationTop];
//}
 
/**
 *  修改默认Delete按钮的文字
 */
//- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath
//{
//    return @"删除";
//}
 
//实现这个方法不仅可以实现左滑功能,还可以自定义左滑的按钮,并且实现按钮点击处理的事件
- (NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath
{
//    self.tableView.editing = YES;
    UITableViewRowAction *action = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleNormal title:@"关注" handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {
//        [self.tableView reloadData];
//        [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationRight];
        // 退出编辑模式
        self.tableView.editing = NO;
    }];
    
    UITableViewRowAction *action1 = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDestructive title:@"删除" handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {
        
        [self.wineArray removeObjectAtIndex:indexPath.row];
        [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
        
    }];
    return @[action1,action];
}
效果图如下:
iOS UITableView的编辑模式

二.编辑单行删除

添加一个"删除"按钮,在实现左滑删除的基础上,在按钮的点击事件里面实现如下代码即可实现单行编辑

#pragma mark - 按钮的点击
- (IBAction)remove {
    // 进入编辑模式
//    self.tableView.editing = !self.tableView.isEditing;
    [self.tableView setEditing:!self.tableView.isEditing animated:YES];
}
效果图如下:
iOS UITableView的编辑模式

三.编辑多行删除

1.允许编辑模式下可以多选  2.打开编辑模式
添加两个按钮,一个是删除按钮一个是批量删除按钮

ViewController.m代码如下

- (void)viewDidLoad {
    [super viewDidLoad];
//    self.tableView.allowsMultipleSelection = YES;
    
    // 告诉tableView在编辑模式下可以多选
    self.tableView.allowsMultipleSelectionDuringEditing = YES;
    
    self.deletedButton.hidden = YES;
}
//批量删除按钮点击
#pragma mark - 按钮的点击
- (IBAction)MultipleRemove {
    // 进入编辑模式
    [self.tableView setEditing:!self.tableView.isEditing animated:YES];
    self.deletedButton.hidden = !self.tableView.isEditing;
}
 
//删除按钮点击
- (IBAction)remove {
    // 千万不要一边遍历一边删除,因为每删除一个元素,其他元素的索引可能会发生变化
    NSMutableArray *deletedWine = [NSMutableArray array];
    for (NSIndexPath *indexPath in self.tableView.indexPathsForSelectedRows) {
        [deletedWine addObject:self.wineArray[indexPath.row]];
    }
    
    // 修改模型
    [self.wineArray removeObjectsInArray:deletedWine];
    
    // 刷新表格
//    [self.tableView reloadData];
    [self.tableView deleteRowsAtIndexPaths:self.tableView.indexPathsForSelectedRows withRowAnimation:UITableViewRowAnimationAutomatic];
}

效果图如下:

iOS UITableView的编辑模式

四.自定义批量删除

1.自定义cell带有打钩控件  2.模型记录是否打钩的状态 3.一个删除按钮处理删除操作
模型cell代码如下:

//  XMGWineCell.h
 
#import <UIKit/UIKit.h>
 
@class XMGWine;
@interface XMGWineCell : UITableViewCell
 
/** 模型属性 */
@property (nonatomic, strong) XMGWine *wine;
 
@end
//  XMGWineCell.m
 
#import "XMGWineCell.h"
#import "XMGWine.h"
 
@interface XMGWineCell ()
 
/** 打钩控件 */
@property (nonatomic, weak) UIImageView *checkedImageView;
@end
@implementation XMGWineCell
 
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
        
        // 添加打钩控件
        UIImageView *checkedImageView = [[UIImageView alloc] init];
        checkedImageView.hidden = YES;
        checkedImageView.image = [UIImage imageNamed:@"check"];
        [self.contentView addSubview:checkedImageView];
        self.checkedImageView = checkedImageView;
    }
    return self;
}
 
- (void)layoutSubviews
{
    [super layoutSubviews];
    
    // 设置打钩的位置和尺寸
    CGFloat WH = 24;
    CGFloat X = self.contentView.frame.size.width - WH - 10;
    CGFloat Y = (self.contentView.frame.size.height - WH) * 0.5;
    self.checkedImageView.frame = CGRectMake(X, Y, WH, WH);
    
    // 调整textLabel的宽度
    CGRect frame = self.textLabel.frame;
    frame.size.width = self.contentView.frame.size.width - WH - 20 - self.textLabel.frame.origin.x;
    self.textLabel.frame = frame;
}
 
- (void)setWine:(XMGWine *)wine
{
    _wine = wine;
    self.textLabel.text = wine.name;
    self.imageView.image = [UIImage imageNamed:wine.image];
    self.detailTextLabel.text = [NSString stringWithFormat:@"¥%@",wine.money];
    
    // 根据模型的checked属性确定打钩控件显示还是隐藏
    if (wine.isCheched) {
        self.checkedImageView.hidden = NO;
    } else {
        self.checkedImageView.hidden = YES;
    }
}
@end

模型代码如下:

//  XMGWine.h
 
#import <Foundation/Foundation.h>
 
@interface XMGWine : NSObject
/**
 *  图标
 */
@property (nonatomic ,copy)NSString *image;
 
/**
 *  价格
 */
@property (nonatomic ,copy)NSString *money;
 
/**
 *  名字
 */
@property (nonatomic ,copy)NSString *name;
 
/** 记录打钩控件的状态 */
@property (nonatomic, assign, getter=isCheched) BOOL checked;
@end
//  XMGWine.m
 
#import "XMGWine.h"
 
@implementation XMGWine
 
@end

ViewController.m代码如下:

//  ViewController.m
 
#import "ViewController.h"
#import "XMGWineCell.h"
#import "MJExtension.h"
#import "XMGWine.h"
 
@interface ViewController ()<UITableViewDataSource ,UITableViewDelegate>
@property (weak, nonatomic) IBOutlet UITableView *tableView;
 
/** 酒数据 */
@property (nonatomic, strong) NSMutableArray *wineArray;
 
/** 记录用户选中行的索引 */
@property (nonatomic, strong) NSMutableArray *seletedIndexPath;
 
@end
 
@implementation ViewController
 
- (NSMutableArray *)seletedIndexPath
{
    if (!_seletedIndexPath) {
        _seletedIndexPath = [NSMutableArray array];
    }
    return _seletedIndexPath;
}
 
- (NSMutableArray *)wineArray
{
    if (!_wineArray) {
        
        _wineArray = [XMGWine mj_objectArrayWithFilename:@"wine.plist"];
    }
    return _wineArray;
}
 
- (void)viewDidLoad {
    [super viewDidLoad];
}
 
#pragma mark - 按钮的点击
 
- (IBAction)remove { 
    // 获取要删除的酒模型
    NSMutableArray *deletedWine = [NSMutableArray array];
    for (NSIndexPath *indexPath in self.seletedIndexPath) {
        [deletedWine addObject:self.wineArray[indexPath.row]];
    }
    
    // 删除模型
    [self.wineArray removeObjectsInArray:deletedWine];
    
    // 刷新表格
    [self.tableView deleteRowsAtIndexPaths:self.seletedIndexPath withRowAnimation:UITableViewRowAnimationAutomatic];
    // 清空数组
    [self.seletedIndexPath removeAllObjects];
}
 
#pragma mark - UITableViewDelegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 修改模型
    XMGWine *wine = self.wineArray[indexPath.row];
    if (wine.isCheched) { // 之前是打钩的,取消打钩
        wine.checked = NO;
        [self.seletedIndexPath removeObject:indexPath];
    } else { // 之前不是打钩的,现在打钩
        wine.checked = YES;
        [self.seletedIndexPath addObject:indexPath];
    }
    
    // 刷新表格
    [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
}
 
#pragma mark - UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return self.wineArray.count;
}
 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *ID = @"wine";
    XMGWineCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
    
    if (cell == nil) {
        cell = [[XMGWineCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
    }
 
    cell.wine = self.wineArray[indexPath.row];
    return cell;
}
@end

效果图如下:

iOS UITableView的编辑模式

未经允许不得转载:作者:SheaYang, 转载或复制请以 超链接形式 并注明出处 技术Dog|博客
原文地址:《iOS UITableView的编辑模式》 发布于2019-11-09

分享到:
赞(0) 打赏

评论 抢沙发

9 + 6 =


iOS UITableView的编辑模式

长按图片转发给朋友

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.0主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。

登录

忘记密码 ?