tableView的编辑(tableView的协议方法)
1.设置导航栏的编辑按钮
// 设置一下导航栏的编辑按钮
self.navigationItem.rightBarButtonItem = self.editButtonItem;
2.开启tableView的编辑模式!!!!!!!!!
// 开启一下tableView的编辑模式
[self.tableView setEditing:YES animated:YES];
协议方法一:重新编辑按钮的方法(重写系统提供的编辑按钮的点击方法)--->2的方法(让tableView和导航栏的状态一样)
#pragma mark 重新编辑按钮的方法
// 重写一下系统提供的编辑按钮的点击方法
- (void)setEditing:(BOOL)editing animated:(BOOL)animated{
[super setEditing:editing animated:animated];
// tableview 和导航栏的状态一样
[self.tableView setEditing:editing animated:animated];
}
协议方法二:逐行的设置,哪些需要编辑,哪些不需要(关键词canEdit)(返回值是BOOL类型)
#pragma mark 逐行的去设置,哪些行编辑,哪些行不编辑
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath{
// // 奇数行可以编辑,偶数不可以
// if (indexPath.row % 2 == 0) {
//
// return NO;
//
// } else {
//
// return YES;
//
// }
return YES;
}
协议方法三:设置编辑的模式(删除,插入,多选的状态)返回值-->uitableviewcelleditingstyle 关键词是editingStyle 插入 | 删除-->是多选状态(| 的作用是一个状态加上另一个状态)
#pragma mark 设置编辑的模式
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
// // tableView 实现多选效果!!!!!!!!竖线的作用(一个状态加上另一个状态,返回多选状态)
// return UITableViewCellEditingStyleInsert | UITableViewCellEditingStyleDelete;
return UITableViewCellEditingStyleDelete;
}
协议方法四:设置删除按钮的标题(默认是delete)返回值是NSString 关键词是titleForDelete
#pragma mark 设置删除按钮的标题(默认是delete)
- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath{
return @"来点我啊";
}
协议方法五:实现左划的效果,对应按钮的点击方法(左划之后可以点击)返回值是void 关键词是commitEditing
步骤1.判断当前的编辑模式 2.删除的话,应该先把数组的对象删除掉 3.更新数据:第一种是直接reloadData !第二种是用deleteRowAtIndexPaths: 方法
#pragma mark 实现这个方法,实现左划效果,而且是对应按钮功能的方法
// 左划之后可以点击,相当于点击方法
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
NSLog(@"编辑开始");
// 先判断当前的编辑模式
if (editingStyle == UITableViewCellEditingStyleDelete) {
// 先把数组里的对象删除掉
[self.modelArr removeObjectAtIndex:indexPath.row];
// // 更新数据(第一种方式)
// [self.tableView reloadData];
// 第二种方式
[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationMiddle];
}
}
协议方法六:移动 返回值(void)关键词move 它只是视觉上的移动,并没有改变数据的顺序,所以想要改变数组的顺序,需要用代码实现 sourceIndexPath destinationIndexPath
步骤1.获取要移动的数据(记得retain,防止内存隐患,防止崩溃) 2.在数组原先的位置里把这个对象移除掉 3.将数据插入到现在的位置
#pragma mark 移动
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath{
// 它只是视觉上移动,并没有改变数据的顺序,所以想要改变数组的顺序,需要用代码来实现
// 获取要移动的数据
// 内存有隐患,所以在这里加retain防止崩溃
Student *stu = [self.modelArr[sourceIndexPath.row] retain];
// 在数组里把这个对象移除掉
[self.modelArr removeObjectAtIndex:sourceIndexPath.row];
// 插入到数组里
[self.modelArr insertObject:stu atIndex:destinationIndexPath.row];
[stu release];
}
左滑有多个按钮功能的协议方法UITableViewRowAction 返回是一个数组
- (nullable NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewRowAction *action = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"ok" handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {
NSLog(@"sdfsfs");
}];
action.backgroundColor = [UIColor redColor];
UITableViewRowAction *actionTwo = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"no" handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {
NSLog(@"sfs");
}];
action.backgroundColor = [UIColor yellowColor];
return @[action, actionTwo];
}
点击之后更改名字(最重要的一件事情就是要将tableview单行刷新,优化不消耗资源!!!!!!!!!!!!!!)关键词是reloadRow
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
// 点击改名
Student *stu = self.modelArr[indexPath.row];
stu.name = @"宋江";
// [self.tableView reloadData];
// tableView的单行刷新!!!!!!!!!!!!(优化)不消耗资源!!!!!!!!!!!!!!!!!!!!!!!!!
[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
}