UITableView编辑的实现原理和删除

一;执行过程spa

1,tableView进入编辑状态代理

  用户点击一个按钮,让程序进入编辑状态,对象

  self.tableView.editing = YES;it

2,询问tableView的cell可否编辑io

  tableView询问dataSource代理,让它执行一个代理方法询问每一行的编辑状态table

  即-(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath  //默认为yes,即在editing = yes时,默认全部行均可删除class

3,询问tableView的编辑类型(删除仍是添加)程序

  tableView询问 delegate代理每一行的编辑状态方法

  即-(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath  //默认状况下为删除im

  其中UITableViewCellEditingStyle为枚举类型

typedef NS_ENUM(NSInteger, UITableViewCellEditingStyle) {

    UITableViewCellEditingStyleNone,

    UITableViewCellEditingStyleDelete,

    UITableViewCellEditingStyleInsert

};//系统自带的三种编辑状态

 

typedef NS_ENUM(NSInteger, UITableViewCellEditingStyle) {

    UITableViewCellEditingStyleNone,

    UITableViewCellEditingStyleDelete,

    UITableViewCellEditingStyleInsert

};

4,tableView响应编辑操做

  由dataSource执行一个代理方法响应编辑操做

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

  具体说明

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

{

    if (editingStyle == UITableViewCellEditingStyleDelete) {//执行删除操做

        

        //1 首先将数据源中的数据删除

        

        

        //2. 从视觉上删除,在视觉删除以前,必须将数据真实地从数据源中删除,不然程序会崩溃(下面方法中的第一个参数为NSArray类型,用来标识所要删除的row,其存放的元素为NSIndexPath对象)

        [_myTableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationLeft];

        // 注意,执行顺序不可变

        

        /**

         *  删除整个section(逻辑与删除section中的行相似)

         */

        //1 首先从数据源中删除数据

        

        //2 从视觉上删除  (下面方法中第一个参数的类型为NSIndexSet,用来标识索要删除的section)

        [_myTableView deleteSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:UITableViewRowAnimationLeft];

        

    }

    if (editingStyle == UITableViewCellEditingStyleInsert) {//执行添加操做

        // 1, 从数据源对应位置添加数据

        

        // 2 在视觉上添加(下面方法的第一个参数为制定的添加位置)

        [_myTableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationLeft];    //此时添加在了所点击的当前位置

        

        //可自定义NSIndexPath对象,来制定插入位置

    }

}

相关文章
相关标签/搜索