对 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 //修改数据,修改UI114 //先修改数据,在修改UI115 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 //关联 tableView179 [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 - Navigation201 202 // In a storyboard-based application, you will often want to do a little preparation before navigation203 - (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