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     //修改数据,修改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

 

转载于:https://my.oschina.net/AngeloTsui/blog/663322

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值