UI - UITableView 编辑 、TableViewController

柴琦
2023-12-01
/*************************** TableViewController ***************************/
1.UITableViewController继承自UIViewController, 自带一个tableView
2.self.view不是UIView, 而是UITableView
3.datasource和delegate默认都是self(UITableViewController)
4.开发中只需要建立UITableViewController子类
/******************************************************/

#import "ViewController.h"

//签订协议
@interface ViewController ()<UITableViewDataSource, UITableViewDelegate>

@property (nonatomic, strong)UITableView *tableView;
@property (nonatomic, strong)NSMutableArray *dataArr;
@property (nonatomic, strong)NSMutableArray *indexArr;//右侧索引数组
@property (nonatomic, strong)NSMutableArray *titleArr;//标题数组

@end

static NSString *reuseIdentifier = @"reuseIdentifier";

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    self.view.backgroundColor = [UIColor whiteColor];

    //载入数据
    [self loadData];

    //新建tableView
    self.tableView = [[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStylePlain];
    //指定协议代理人
    self.tableView.delegate = self;
    self.tableView.dataSource = self;
    [self.view addSubview:self.tableView];//添加tableView

    //给tableView注册cell
//    [UITableViewCell class] 获取UITableViewCell类
    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:reuseIdentifier];

    //设置成编辑按钮
    self.navigationItem.rightBarButtonItem = self.editButtonItem;
}

//实现协议方法
//返回分区下的行数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    NSMutableArray *arr = [self.dataArr objectAtIndex:section];
    return arr.count;
}
//返回行下的cell
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: reuseIdentifier forIndexPath:indexPath];

    cell.textLabel.text = [self.dataArr objectAtIndex:indexPath.section] [indexPath.row];
    return cell;
}
//设置分区个数
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return self.dataArr.count;
}

//设置页眉标题
//- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
//    return self.titleArr[section];
//}

//设置分区头View
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
    UILabel *label = [[UILabel alloc]init];
    label.backgroundColor = [UIColor lightGrayColor];
    label.text = [NSString stringWithFormat:@"   %@", self.titleArr[section]];
    return label;
}
//设置页眉高度: UITableViewStylePlain类型时, 需要设置
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
    return 40;
}
/*************************** TableView 的编辑 ***************************/
#pragma mark--编辑第一步: 让tableView处于编辑状态
- (void)setEditing:(BOOL)editing animated:(BOOL)animated{
    //1.
    [super setEditing:editing animated:animated];
    //2.
    [self.tableView setEditing:editing animated:animated];
}

#pragma mark--编辑第二步: 指定哪一行可以编辑
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath{
    return YES;
}

#pragma mark--编辑第三步: 指定tableView编辑样式(默认是删除)
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
    if (indexPath.row == 2) {
//        return UITableViewCellEditingStyleInsert;//插入样式(一般不用)
    }
    return UITableViewCellEditingStyleDelete;
}

#pragma maek--编辑第四步: 提交编辑
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
    //判断样式是否为删除样式
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        //1.先删除数据源
        NSMutableArray *arr = [self.dataArr objectAtIndex:indexPath.section];
        //数组中删除对应的元素
        [arr removeObjectAtIndex:indexPath.row];//利用索引
//        源数组中删除对应的数据(名字相同, 用str会崩溃)
        //地址相同, 常量字符串
        //    NSString *str1 = @"getter";
        //    NSString *str2 = @"getter";

        //2.再删除UI(cell)
        [self.tableView beginUpdates];//代码块, 将更新UI的代码写在中间

        [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];

        [self.tableView endUpdates];

        //删除完以后判断该分区是否为空, 若为空删除该分区
        if (arr.count == 0) {//数组元素是否为0
            //1.删除数据源
            [self.dataArr removeObjectAtIndex:indexPath.section];
            //删除右侧索引
            [self.indexArr removeObjectAtIndex:indexPath.section];
            //2.删除UI
            [self.tableView beginUpdates];

            [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:UITableViewRowAnimationRight];
            [self.tableView endUpdates];
        }

        //附:
//         [self.tableView reloadData];//重新执行协议代码
//        self.tableView reloadRowsAtIndexPaths:(nonnull NSArray<NSIndexPath *> *) withRowAnimation:  //reloadRow
//        self.tableView reloadSections:(nonnull NSIndexSet *) withRowAnimation:(UITableViewRowAnimation) //reloadSection

    }
}
/***************************       End      ***************************/
//右侧索引
- (NSArray<NSString *> *)sectionIndexTitlesForTableView:(UITableView *)tableView{
    return self.indexArr;
}

//加载数据
- (void)loadData{
    NSMutableArray *arr1 = [NSMutableArray arrayWithObjects:@"¥hhh, .$",@" ¥Chin ese ",@"开源中国",@"www.oschina.net", @"开源技术", nil];
    NSMutableArray *arr2 = [NSMutableArray arrayWithObjects:@"社区", @"开发者", @"传播", @"2013", @"100", @"中国", @"暑假作业",@"键盘", @"鼠标",@"hello",@"world", nil];
    self.indexArr = [NSMutableArray arrayWithObjects:@"1", @"2", nil];
    self.dataArr = [NSMutableArray arrayWithObjects:arr1, arr2, nil];
    self.titleArr = @[@"iOS", @"Android"].mutableCopy;
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
 类似资料: