对 UITableView 进行添加,删除,移动,基本操作的流程.
1.初始化 UITableView 步骤:
1> 遵守协议 <UITableViewDelegate,UITableViewDataSource>
2> 设置代理
3> 实现方法 必须实现的方法有两个 - (NSInteger)tableView:numberOfRowsInSection:(设置每个分组的行数)- (UITableViewCell*)tableView: cellForRowAtIndexPath: (设置每行的显示)
2.对 tableView 进行增删移动操作 (通过实现协议方法)
1>设置是否可编译 - (BOOL)tableView: canEditRowAtIndexPath: 返回 YES 可以编辑,返回 NO 不可编辑
2>设置编辑的类型 - (UITableViewCellEditingStyle)tableView: editingStyleForRowAtIndexPath: 返回 UITableViewCellEditingStyleDelete 删除操作,UITableViewCellEditingStyleInsert 添加操作
3>完成编辑操作:
添加和删除操作相似,实现 - (void)tableView: commitEditingStyle: forRowAtIndexPath: 在进行操作时,一定是先对数据操作,然后操作 Cell
删除操作:(实例方法)deleteSections: withRowAnimation: 删除分组 deleteRowsAtIndexPaths: withRowAnimation: 删除行
添加操作:(实例方法)insertRowsAtIndexPaths: withRowAnimation: 添加行
移动操作:- (void)tableView: moveRowAtIndexPath: toIndexPath:在进行操作时,一定是先对数据操作,然后操作 Cell
移动操作:数据处理过程:先存储要移动数据,删除原数据,插入数据
调用实例方法:moveRowAtIndexPath: toIndexPath: 两个参数 原位置,要移动到的位置
限定移动的范围:- (NSIndexPath*)tableView: targetIndexPathForMoveFromRowAtIndexPath: (如果限定在同一分组内移动,判断传入的参数的 section 是否相等,(第一个参数原位置,第二个参数要移动的位置),相等返回要移动到的位置,不同返回原位置.
个人写的一个简单的实现代码:
1 // 2 // RootViewController.m 3 // Lesson10_HomeWork 4 // 5 // Created by Ager on 15/10/26. 6 // Copyright © 2015年 Ager. All rights reserved. 7 // 8 9 #import "RootViewController.h" 10 11 @interface RootViewController () 12 { 13 UITableViewCellEditingStyle style; //表示对 table 的操作类型 14 BOOL addFlag; //表示 addButton 按钮的状态 15 } 16 17 @end 18 19 @implementation RootViewController 20 21 - (void)loadView{ 22 self.rootView = [[RootView alloc]initWithFrame:[UIScreen mainScreen].bounds]; 23 self.view = self.rootView; 24 } 25 26 - (void)viewDidLoad { 27 [super viewDidLoad]; 28 // Do any additional setup after loading the view. 29 30 //设置代理 31 self.rootView.tableView.delegate = self; 32 self.rootView.tableView.dataSource = self; 33 34 //初始化数据 35 self.DataArray = [NSMutableArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"DataArray" ofType:@"plist"]]; 36 37 //添加删除触发按钮 38 self.navigationItem.rightBarButtonItem = self.editButtonItem; 39 self.editButtonItem.title = @"删除"; 40 41 //添加 添加数据按钮 42 UIBarButtonItem *addButton = [[UIBarButtonItem alloc]initWithTitle:@"添加" style:UIBarButtonItemStylePlain target:self action:@selector(insertAction:)]; 43 addFlag = NO; 44 self.navigationItem.leftBarButtonItem = addButton; 45 46 47 } 48 49 #pragma mark --- 实现代理方法 --- 50 51 #pragma mark --- 必须实现的方法 --- 52 53 54 /** 55 * 每组数据的行数 56 */ 57 58 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 59 return [[self.DataArray objectAtIndex:section] count]; 60 } 61 62 63 /** 64 * 设置cell 65 */ 66 67 - (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 68 static NSString *cell_id = @"cell_id"; 69 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cell_id]; 70 if (!cell) { 71 cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cell_id]; 72 } 73 74 cell.textLabel.text = [[self.DataArray objectAtIndex:indexPath.section] objectAtIndex:indexPath.row]; 75 return cell; 76 } 77 78 79 #pragma mark --- 不必须实现的代理方法 --- 80 81 /** 82 * 分组数 83 */ 84 85 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ 86 return [self.DataArray count]; 87 } 88 89 90 #pragma mark --- 对 TableView 编辑 --- 91 92 93 /** 94 * 设置是否可以编辑 95 */ 96 - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath{ 97 return YES; 98 } 99 100 101 /** 102 * 设置编辑类型 103 */ 104 - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{ 105 return style; 106 } 107 108 109 /** 110 * 完成 TableView 操作 111 */ 112 - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{ 113 //修改数据,修改UI 114 //先修改数据,在修改UI 115 116 if (editingStyle == UITableViewCellEditingStyleDelete) { 117 //删除行 118 if ([[self.DataArray objectAtIndex:indexPath.section] count] == 1) { 119 //删除分组 120 [self.DataArray removeObjectAtIndex:indexPath.section]; 121 [tableView deleteSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:UITableViewRowAnimationRight]; 122 }else { 123 124 //删除单行 125 [[self.DataArray objectAtIndex:indexPath.section] removeObjectAtIndex:indexPath.row]; 126 [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationRight]; 127 } 128 }else if (editingStyle == UITableViewCellEditingStyleInsert){ 129 //添加数据 130 //添加一行 131 [[self.DataArray objectAtIndex:indexPath.section] insertObject:@"Ager" atIndex:indexPath.row]; 132 [tableView insertRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationRight]; 133 } 134 } 135 136 137 #pragma mark --- cell 移动 --- 138 139 140 /** 141 * 移动行 142 * 143 */ 144 - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath{ 145 146 //先存储要移动的数据 147 NSString *str = [[self.DataArray objectAtIndex:sourceIndexPath.section] objectAtIndex:sourceIndexPath.row]; 148 //删除原数据 149 [[self.DataArray objectAtIndex:sourceIndexPath.section] removeObjectAtIndex:sourceIndexPath.row]; 150 //在要移动到地方添加数据 151 [[self.DataArray objectAtIndex:destinationIndexPath.section] insertObject:str atIndex:destinationIndexPath.row]; 152 [tableView moveRowAtIndexPath:sourceIndexPath toIndexPath:destinationIndexPath]; 153 } 154 155 156 /** 157 * 限定移动范围 158 */ 159 - (NSIndexPath*)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath{ 160 if (sourceIndexPath.section == proposedDestinationIndexPath.section) { 161 return proposedDestinationIndexPath; 162 }else { 163 return sourceIndexPath; 164 } 165 } 166 167 168 #pragma mark --- 添加按钮的方法实现 --- 169 170 171 /** 172 * 点击删除按钮 173 */ 174 - (void)setEditing:(BOOL)editing animated:(BOOL)animated{ 175 176 style = UITableViewCellEditingStyleDelete; 177 [super setEditing:editing animated:animated]; 178 //关联 tableView 179 [self.rootView.tableView setEditing:editing animated:animated]; 180 self.editButtonItem.title = editing ? @"完成":@"删除"; 181 } 182 183 184 /** 185 * 点击添加按钮 186 */ 187 - (void)insertAction:(UIBarButtonItem *)sender{ 188 style = UITableViewCellEditingStyleInsert; 189 addFlag = !addFlag; 190 [self.rootView.tableView setEditing:addFlag animated:YES]; 191 sender.title = addFlag ? @"完成":@"添加"; 192 } 193 194 - (void)didReceiveMemoryWarning { 195 [super didReceiveMemoryWarning]; 196 // Dispose of any resources that can be recreated. 197 } 198 199 /* 200 #pragma mark - Navigation 201 202 // In a storyboard-based application, you will often want to do a little preparation before navigation 203 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 204 // Get the new view controller using [segue destinationViewController]. 205 // Pass the selected object to the new view controller. 206 } 207 */ 208 209 @end