一、tableView的编辑
tableView
编辑的步骤:
* 1. 让tableView成为可编辑状态
* 1. 让tableView成为可编辑状态
编辑按钮触发方法
* -1. 激活编辑状态
- (void)rightButton:(UIBarButtonItem
*)rightButton
{
// 开启UITableView 编辑状态
// self.tableView.editing 默认是 NO 的
[self.tableView setEditing:!self.tableView.editing animated:YES];
// 更改按钮的标题
if (_tableView.editing) {
rightButton.title = @"完成";
} else {
rightButton.title = @"编辑";
}
{
// 开启UITableView 编辑状态
// self.tableView.editing 默认是 NO 的
[self.tableView setEditing:!self.tableView.editing animated:YES];
// 更改按钮的标题
if (_tableView.editing) {
rightButton.title = @"完成";
} else {
rightButton.title = @"编辑";
}
}
* 2.
返回(指定)可以被编辑的分区的行
(默认是YES)
//
如果不写的话
默认是YES
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
return YES;
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
return YES;
}
* 3.
返回(指定)可以被编辑的分区的行的样式
添加
Or
删除
//
返回哪个分区的哪行的
编辑样式
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
// 先判断分区
if (indexPath.section == 0) {
// 再判断数据
if ([self.firstDataArray[indexPath.row] isEqualToString:@"添加"]) {
return UITableViewCellEditingStyleInsert;
}
} else if (indexPath.section == 1) {
// 再判断数据
if ([self.secondDataArray[indexPath.row] isEqualToString:@"添加"]) {
return UITableViewCellEditingStyleInsert;
}
}
return UITableViewCellEditingStyleDelete;
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
// 先判断分区
if (indexPath.section == 0) {
// 再判断数据
if ([self.firstDataArray[indexPath.row] isEqualToString:@"添加"]) {
return UITableViewCellEditingStyleInsert;
}
} else if (indexPath.section == 1) {
// 再判断数据
if ([self.secondDataArray[indexPath.row] isEqualToString:@"添加"]) {
return UITableViewCellEditingStyleInsert;
}
}
return UITableViewCellEditingStyleDelete;
}
* 4.
按照编辑的样式
来提交编辑的结果,完成不同的操作
-1- √ 更新数据源数据
-2- √ 刷新界面
-1- √ 更新数据源数据
-2- √ 刷新界面
int
i =
4, j =
4;
// 4. 按照编辑的样式 提交哪个分区哪行的结果 完成编辑
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *str = [NSString stringWithFormat:@"%d", i];
NSString *str1 = [NSString stringWithFormat:@"%d", j];
// 更新数据
// 刷新界面
// 先判断分区
if (indexPath.section == 0) {
// 第一分区
// 再判断编辑样式
if (editingStyle == UITableViewCellEditingStyleDelete) {
// 删除
// 利用indexPath.row 删除数组中相对应的数据
[self.firstDataArray removeObjectAtIndex:indexPath.row];
// 刷新界面
// 下面方法 用在删除数据的时候刷新界面
// 需要一个数组 数组中是删除的索引 这个数组可以是多行的索引
// 下面的刷新方法是对行进行操作的
[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:(UITableViewRowAnimationLeft)];
} else {
// 添加
// [self.firstDataArray insertObject:str atIndex:[self.firstDataArray count] - 1];
[self.firstDataArray insertObject:str atIndex:indexPath.row];
[self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:(UITableViewRowAnimationLeft)];
i++;
}
} else {
// 第二分区
// 再判断编辑样式
if (editingStyle == UITableViewCellEditingStyleDelete) {
// 删除
[self.secondDataArray removeObjectAtIndex:indexPath.row];
// 刷新界面
// 下面方法 用在删除数据的时候刷新界面
// 需要一个数组 数组中是删除的索引 这个数组可以是多行的索引
[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:(UITableViewRowAnimationLeft)];
} else {
// 添加
[self.secondDataArray insertObject:str1 atIndex:indexPath.row];
[self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:(UITableViewRowAnimationBottom)];
j++;
}
}
// 4. 按照编辑的样式 提交哪个分区哪行的结果 完成编辑
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *str = [NSString stringWithFormat:@"%d", i];
NSString *str1 = [NSString stringWithFormat:@"%d", j];
// 更新数据
// 刷新界面
// 先判断分区
if (indexPath.section == 0) {
// 第一分区
// 再判断编辑样式
if (editingStyle == UITableViewCellEditingStyleDelete) {
// 删除
// 利用indexPath.row 删除数组中相对应的数据
[self.firstDataArray removeObjectAtIndex:indexPath.row];
// 刷新界面
// 下面方法 用在删除数据的时候刷新界面
// 需要一个数组 数组中是删除的索引 这个数组可以是多行的索引
// 下面的刷新方法是对行进行操作的
[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:(UITableViewRowAnimationLeft)];
} else {
// 添加
// [self.firstDataArray insertObject:str atIndex:[self.firstDataArray count] - 1];
[self.firstDataArray insertObject:str atIndex:indexPath.row];
[self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:(UITableViewRowAnimationLeft)];
i++;
}
} else {
// 第二分区
// 再判断编辑样式
if (editingStyle == UITableViewCellEditingStyleDelete) {
// 删除
[self.secondDataArray removeObjectAtIndex:indexPath.row];
// 刷新界面
// 下面方法 用在删除数据的时候刷新界面
// 需要一个数组 数组中是删除的索引 这个数组可以是多行的索引
[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:(UITableViewRowAnimationLeft)];
} else {
// 添加
[self.secondDataArray insertObject:str1 atIndex:indexPath.row];
[self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:(UITableViewRowAnimationBottom)];
j++;
}
}
}
二、tableView的移动
tableView
移动的步骤:
* 1. 让tableView成为可编辑状态
* 1. 让tableView成为可编辑状态
/**编辑按钮触发方法
* 1. 激活编辑状态
*
*
*/
- (void)rightButton:(UIBarButtonItem *)rightButton
{
// 开启UITableView 编辑状态
// self.tableView.editing 默认是 NO 的
[self.tableView setEditing:!self.tableView.editing animated:YES];
// 更改按钮的标题
if (_tableView.editing) {
rightButton.title = @"完成";
} else {
rightButton.title = @"编辑";
}
* 1. 激活编辑状态
*
*
*/
- (void)rightButton:(UIBarButtonItem *)rightButton
{
// 开启UITableView 编辑状态
// self.tableView.editing 默认是 NO 的
[self.tableView setEditing:!self.tableView.editing animated:YES];
// 更改按钮的标题
if (_tableView.editing) {
rightButton.title = @"完成";
} else {
rightButton.title = @"编辑";
}
}
* 2.
返回(指定)可以被移动的分区的行
(默认的是YES)
- (BOOL)tableView:(UITableView
*)tableView canMoveRowAtIndexPath:(NSIndexPath
*)indexPath
{
return YES;
{
return YES;
}
* 3.
完成移动后
-1-
更新数据 -2-
刷新界面
//
移动完成
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath
// sourceIndexPath 来源的索引 (拿起来cell 的位置)
// destinationIndexPath 目的地/终点的索引 (将来要放下cell 的位置)
{
// 分两种情况 1. 同section 的移动(同区移动), 不同section 之间的 移动(跨区移动)
if (sourceIndexPath.section == destinationIndexPath.section) {
// 同区
if (sourceIndexPath.section == 0) {
// 操作第一分区数组
// 先保存一下来源索引处的数据
NSString *str = self.firstDataArray[sourceIndexPath.row];
// 再从数组中 按来源索引删除该数据
[self.firstDataArray removeObjectAtIndex:sourceIndexPath.row];
// 最后再把保存的数据 插入到目的地的索引处
[self.firstDataArray insertObject:str atIndex:destinationIndexPath.row];
// 刷新页面
[self.tableView moveRowAtIndexPath:sourceIndexPath toIndexPath:destinationIndexPath];
} else{
// 操作第二分区数组
NSString *str = self.secondDataArray[sourceIndexPath.row];
[self.secondDataArray removeObjectAtIndex:sourceIndexPath.row];
[self.secondDataArray insertObject:str atIndex:destinationIndexPath.row];
[self.tableView moveRowAtIndexPath:sourceIndexPath toIndexPath:destinationIndexPath];
}
} else {
// 跨区
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath
// sourceIndexPath 来源的索引 (拿起来cell 的位置)
// destinationIndexPath 目的地/终点的索引 (将来要放下cell 的位置)
{
// 分两种情况 1. 同section 的移动(同区移动), 不同section 之间的 移动(跨区移动)
if (sourceIndexPath.section == destinationIndexPath.section) {
// 同区
if (sourceIndexPath.section == 0) {
// 操作第一分区数组
// 先保存一下来源索引处的数据
NSString *str = self.firstDataArray[sourceIndexPath.row];
// 再从数组中 按来源索引删除该数据
[self.firstDataArray removeObjectAtIndex:sourceIndexPath.row];
// 最后再把保存的数据 插入到目的地的索引处
[self.firstDataArray insertObject:str atIndex:destinationIndexPath.row];
// 刷新页面
[self.tableView moveRowAtIndexPath:sourceIndexPath toIndexPath:destinationIndexPath];
} else{
// 操作第二分区数组
NSString *str = self.secondDataArray[sourceIndexPath.row];
[self.secondDataArray removeObjectAtIndex:sourceIndexPath.row];
[self.secondDataArray insertObject:str atIndex:destinationIndexPath.row];
[self.tableView moveRowAtIndexPath:sourceIndexPath toIndexPath:destinationIndexPath];
}
} else {
// 跨区
}
4.重要的.
***** iOS
中是不允许跨区移动的
//
系统有一个自带的方法限制跨区移动
// 只要拖动 就会触发这个方法
-(NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath
{
// sourceIndexPath 来源的索引 (拿起来cell 的位置)
// proposedDestinationIndexPath 推荐/建议的 目的地/终点的索引 (将来要放下cell 的位置)
if (sourceIndexPath.section == proposedDestinationIndexPath.section) {
return proposedDestinationIndexPath;
} else {
return sourceIndexPath;
}
// 只要拖动 就会触发这个方法
-(NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath
{
// sourceIndexPath 来源的索引 (拿起来cell 的位置)
// proposedDestinationIndexPath 推荐/建议的 目的地/终点的索引 (将来要放下cell 的位置)
if (sourceIndexPath.section == proposedDestinationIndexPath.section) {
return proposedDestinationIndexPath;
} else {
return sourceIndexPath;
}
}
三、UITableViewController
* UITableViewController
1. 自带了一个 self.tableView 根屏幕一样大
2. 代理协议 数据源 已经给写好了
1. 自带了一个 self.tableView 根屏幕一样大
2. 代理协议 数据源 已经给写好了
3.
实现了一部分
代理方法