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 }