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 }