·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> app软件开发 >> IOS开发 >> UITableView编辑

UITableView编辑

作者:佚名      IOS开发编辑:admin      更新时间:2022-07-23

对 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