• UI-关于tableView编辑 tableView移动 的代码理解



      

      1 #import "ViewController.h"
      2 
      3 #pragma mark-   编辑的步骤
      4 //UITableView编辑步骤
      5 @interface ViewController ()<UITableViewDelegate, UITableViewDataSource>
      6 {//第一步;UITableView有两种编辑状态 默认是删除状态,所以我们要一个容器 保存我们想要的状态
      7     UITableViewCellEditingStyle _editeStyle;
      8     
      9 
     10 }
     11 @property(nonatomic, strong)UITableView *tableView;
     12 @property(nonatomic, strong)NSMutableArray *array;
     13 
     14 @end
     15 
     16 @implementation ViewController
     17 
     18 - (void)viewDidLoad {
     19     [super viewDidLoad];
     20     
     21     NSMutableArray *arr1 = [[NSMutableArray alloc]initWithObjects:@"", @"", @"�是 @"发给", @"到的", @"到的", @"", @"而非", @"二夫人", @"萨达", @"是否", @"", @"生产国", @"沃尔夫", @"而非", @"", @"额外人", @"", @"热热涛", @"恩恩", @"恩恩", nil];
     22     
     23     NSMutableArray *arr2 = [[NSMutableArray alloc]initWithObjects:  @"", @"玩儿", @"确认", @"二人台", @"二二", @"二恶", @"温热", @"曲婉婷", @"太突然", @"日阿斯顿", @"恶趣味", @"巍峨", @"的飞", @"二恶", @"亲爱的风格", @"", @"", @"", @"陈请求", @"恩恩", @"恩恩", @"恩恩", @"恩恩", nil];
     24     
     25     _array = [[NSMutableArray alloc]initWithObjects:arr1, arr2,  nil];
     26     
     27     _tableView = [[UITableView alloc]initWithFrame:self.view.frame style:(UITableViewStylePlain)];
     28     _tableView.delegate = self;
     29     _tableView.dataSource = self;
     30     
     31     [self.view addSubview:_tableView];
     32     //设置左右两边的Titl或者左右两边的按钮,就使用 navigationTitem
     33     //如果想要设置navigationController的样式,使用self.navigationControll.navigationBar
     34     self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:(UIBarButtonSystemItemEdit) target:self action:@selector(rightBarButtonItemClick:)];
     35     self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:(UIBarButtonSystemItemAdd) target:self action:@selector(leftBarButtonItemClick:)];
     36     
     37     
     38     
     39 }
     40 //返回分区的个数,最好与大的数组的个数相同
     41 -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
     42     return _array.count;
     43     
     44 }
     45 //返回每个分区的cell的个数
     46 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
     47     return [_array[section]count];
     48     
     49 }
     50 //返回 每个分区的头的高度
     51 -(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
     52     return 50;
     53     
     54 
     55 }
     56 //
     57 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
     58    static NSString *str = @"CELL";
     59     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:str];
     60     
     61     if (!cell) {
     62         cell =  [[UITableViewCell alloc]initWithStyle:(UITableViewCellStyleSubtitle) reuseIdentifier:str];
     63         
     64     }
     65     cell.textLabel.text = self.array[indexPath.section][indexPath.row];
     66     return cell;
     67     
     68 }
     69 //第二步:在触发编辑的方法里,设定是要插入还是删除 然后让tableView进入该状态
     70 -(void)rightBarButtonItemClick:(UIBarButtonSystemItem *)sender{
     71     //保存我们想要编辑的状态
     72     _editeStyle = UITableViewCellEditingStyleDelete;
     73     //设置tableView的编辑状态为 当前编辑状态的相反状态
     74     [self.tableView setEditing:!self.tableView.isEditing animated:YES];
     75     
     76 
     77 }
     78 //在触发编辑的方法里,设定是要插入还是删除 然后让tableView进入该状态
     79 -(void)leftBarButtonItemClick:(UIBarButtonSystemItem *)sender{
     80     //保存我们想要编辑的状态
     81   _editeStyle = UITableViewCellEditingStyleInsert;
     82     //设置tableView的编辑状态为 当前编辑状态的相反状态
     83 
     84     [self.tableView setEditing:!self.tableView.isEditing
     85                       animated:YES];
     86     
     87 }
     88 //第三步:设置哪一个Cell可以进行编辑,如果不写 默认为都可以
     89 -(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath{
     90 //全部可以编辑
     91     return YES;
     92     
     93 
     94 }
     95 //第四步:在进入编辑之前,通过这个方法,返回编编辑的状态(插入和删除)
     96 -(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
     97 
     98       return _editeStyle;
     99     
    100 
    101 }
    102 //真正进入编辑状态,执行编辑的事情
    103 -(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
    104     //处理删除或者插入的过程
    105     //判断是要做插入还是删除
    106     if (editingStyle == UITableViewCellEditingStyleDelete) {
    107         
    108         //在编辑的时候一定要先处理数据源,然后在去处理UI
    109         //删除分区中的要删除的元素
    110         [self.array[indexPath.section] removeObjectAtIndex:indexPath.row];
    111        // tableView 删除一个cell的方法 第一个参数代表删除哪一个分区下的cell,第二个代表删除的动画
    112         [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:(UITableViewRowAnimationRight)];
    113         
    114         
    115     }else {
    116     
    117         NSMutableArray *arr = self.array[indexPath.section];
    118         //插入的时候改变数组元素的位置 必须和更新的UI的位置相一致
    119         [arr insertObject:@"我的岩岩" atIndex:indexPath.row];
    120         NSIndexPath *index = [NSIndexPath indexPathForItem:indexPath.row inSection:indexPath.section];
    121         [self.tableView insertRowsAtIndexPaths:@[index] withRowAnimation:(UITableViewRowAnimationLeft)];
    122         
    123     }
    124   
    125 
    126 }
    127 #pragma mark  移动部分
    128 //第一步:判断是否可以移动cell
    129 -(BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath{
    130 
    131     return YES;
    132     
    133 
    134 }
    135 //第二步:返回移动的目的地
    136 //这里可以限制跨区域移动
    137 -(NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath
    138 {
    139 //判断是否是相同的分区
    140     if (sourceIndexPath.section == proposedDestinationIndexPath.section) {
    141         //如果是则返回可以移动到得目的地
    142         return proposedDestinationIndexPath;
    143         
    144     }
    145     else{
    146         //不是一个分区的则返回原来的位置
    147         return sourceIndexPath;
    148         
    149     
    150     }
    151 
    152 }
    153 //第三步:处理移动结果的代理方法,注意要在编辑状态下才可以移动
    154 //写了这个方法之后右边才会出现移动的三道横杠
    155 //在这个方法里处理数据移动
    156 
    157 -(void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath{
    158     //把移动的cell保存到一个 字符串里
    159     NSString *str = self.array[sourceIndexPath.section][sourceIndexPath.row];
    160     //将这个位置的cell移除
    161     [self.array[sourceIndexPath.section] removeObjectAtIndex:sourceIndexPath.row];
    162     //在将保存的字符串(其实就是移除的cell)在插入所要移动的心得位置,注意这个新的位置是由上面返回的位置(不在一个位置则新的位置是原来的位置  如果在一个分区则是则新的位置就是你想要移动到的位置)
    163     [self.array[sourceIndexPath.section] insertObject:str atIndex:sourceIndexPath.row];
    164     
    165 }
  • 相关阅读:
    职业规划——第1.0章、模拟面试的小记(一)
    菜鸟VUER学习记——零0章、打开新的大门
    职业规划——第0章、哇,原来需要的这么多
    经营自己,愈发强大——《软技能——代码之外的生存指南》读后感
    如何阅读一本书
    Java开发规范
    JVM堆和栈的区别
    2016年7月书单推荐
    web性能优化——代理(nginx)
    web性能优化——浏览器相关
  • 原文地址:https://www.cnblogs.com/YDBBK/p/4820598.html
Copyright © 2020-2023  润新知