你的位置:首页 > 操作系统

[操作系统]UITableView 编辑


对 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