(原创)iOS tableview系统左滑删除 左滑置顶 自定义左滑事件功能 输入框弹出
来源:互联网 发布:java filedialog 编辑:程序博客网 时间:2024/04/27 22:08
关于左滑删除这块,相信不少朋友都遇到过。UITableView自定一个左滑的按钮可以自定义,但是越来越多的需求左滑时要实现多个功能。iOS8之后系统实现了左滑自定多个实现的功能。
很简单,首先需要创建一个UITableView.
UITableView *table = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain]; table.delegate = self; table.dataSource = self; table.tableFooterView = [[UIView alloc] init]; self.tableView = table; [self.view addSubview:_tableView];
数据源可以随意添加一个,此处我用一个双重for循环,模拟出不同的人名和人的编号,并用懒加载的方式放到数据源数组中。
#pragma mark 懒加载数据- (NSMutableArray *)dataArray { if (_dataArray == nil) { _dataArray = @[].mutableCopy; NSArray *lastNames = @[@"赵", @"钱", @"孙", @"李"]; NSArray *firstNames = @[@"虎",@"龙",@"狼",@"豹",@"蛇"]; //双重循环创建对象 for (int i = 0; i < lastNames.count; i++) { for (int j = 0; j < firstNames.count; j++) { NSString *name = [NSString stringWithFormat:@"%@%@", lastNames[i], firstNames[j]]; int ID = i * (int)lastNames.count + j; TyunModel *model = [[TyunModel alloc] initWithName:name ID:ID]; [_dataArray addObject:model]; } } } return _dataArray;}简单实现一个tableview之后效果如下图
此时左右滑动是没有任何作用的,关键方法就在实现UITableViewDeledate里面的方法,该方法iOS8之后才有。(若要兼容7之前,推荐一个库MGSwipeTableCell)
- (nullable NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath举一个简单例子,我定义三个按钮,实现删除、置顶和重编辑人物姓名。创建代码和效果图如下:
- (NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath { //添加一个删除按钮 UITableViewRowAction *deleteAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDestructive title:@"删除" handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) { }]; //添加一个置顶按钮 UITableViewRowAction *topAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDestructive title:@"置顶" handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) { }]; topAction.backgroundColor = [UIColor blueColor]; //添加一个编辑按钮 UITableViewRowAction *editAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDestructive title:@"修改" handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) { }]; editAction.backgroundColor = [UIColor greenColor]; return @[deleteAction, topAction, editAction]; }
关于三个功能的实现,需要注意的是,所有关于tableview的操作如果影响到了页面cell的显示,通通遵循一个原则,就是先改数据,后变UI。另外关于置顶,不能单纯交换需要置顶项和第一项的数据;而是将需要置顶项插入到最前面。然后弹窗输入信息修改人物名字这块,简单示范了一下iOS9之后才出的UIAlertController的用法。此处有一个小细节就是点击了置顶之后,理想状态是该项移动到顶部之后滑出的菜单自动收回,之前没注意用的GCD延时利用[tableview reloadData],但是显示不太友好,可以在置顶操作之后加上[tableview setEditing:NO]; 完整实现代码
#pragma Mark 左滑按钮 iOS8以上- (NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath { //添加一个删除按钮 UITableViewRowAction *deleteAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDestructive title:@"删除" handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) { //先删数据 再删UI [self.dataArray removeObjectAtIndex:indexPath.row]; [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; }]; //添加一个置顶按钮 UITableViewRowAction *topAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDestructive title:@"置顶" handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) { // [self.dataArray exchangeObjectAtIndex:0 withObjectAtIndex:indexPath.row]; TyunModel *model = self.dataArray[indexPath.row]; [self.dataArray removeObjectAtIndex:indexPath.row]; [self.dataArray insertObject:model atIndex:0]; [tableView moveRowAtIndexPath:indexPath toIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]]; // dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ // // [tableView reloadData]; // }); [tableView setEditing:NO]; }]; topAction.backgroundColor = [UIColor blueColor]; //添加一个编辑按钮 UITableViewRowAction *editAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDestructive title:@"修改" handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) { TyunModel *model = self.dataArray[indexPath.row]; //弹窗输入名字 UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"修改" message:@"请输入新名字" preferredStyle:UIAlertControllerStyleAlert]; [alert addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) { textField.placeholder = @"此处输入名字"; textField.clearButtonMode = UITextFieldViewModeWhileEditing; textField.borderStyle = UITextBorderStyleRoundedRect; }]; [alert addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) { [tableView setEditing:NO]; }]]; [alert addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { UITextField *textfield = alert.textFields.firstObject; NSString *newName = textfield.text; if (newName == nil) { newName = @""; } model.name = newName; [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; }]]; [self presentViewController:alert animated:YES completion:nil]; }]; editAction.backgroundColor = [UIColor greenColor]; return @[deleteAction, topAction, editAction];}
至此,全部功能实现。另外有一个小彩蛋就是tableview 每个cell的分割线其实是可以调整长度的。比如说让线条从最左边到最右边
#pragma 设置线条画满- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { if ([cell respondsToSelector:@selector(setSeparatorInset:)]) { [cell setSeparatorInset:UIEdgeInsetsZero]; } if ([cell respondsToSelector:@selector(setLayoutMargins:)]) { [cell setLayoutMargins:UIEdgeInsetsZero]; }}
******以上
(欢迎随手给一颗星星哦~)本篇博客Demo地址https://github.com/xmy0010/DemoForCSDN
本人邮箱18144200589@163.com欢迎小伙伴一起讨论,学习,进步。
0 0
- (原创)iOS tableview系统左滑删除 左滑置顶 自定义左滑事件功能 输入框弹出
- iOS tableview左滑删除不灵敏
- iOS tableview左滑删除失效
- Android ListView左滑删除、左滑自定义功能
- (原创)iOS 左滑删除,左滑时修改tableview中的样式
- tableView自定义左滑打电话
- tableview自定义左滑按钮
- tableView左滑删除,自定义标题+cell长按手势
- swift tableview的左滑删除,左滑显示自定义图片。
- cell左滑删除功能
- ios 设置tableview左滑删除按钮的相关属性
- tableView的左滑删除某个cell
- 左滑tableview出现删除按钮
- iOS UITableViewCell左滑删除
- IOS笔记(9)- tableView的左滑删除和多选删除
- UITableView左滑 删除
- UITableView左滑删除
- ListView左滑删除
- windows 安装搭建 Nginx
- 分布式缓存- Spring中Memcache的使用
- Array.prototype.slice.call(arguments)
- 数据库查询优化
- Spring的AOP
- (原创)iOS tableview系统左滑删除 左滑置顶 自定义左滑事件功能 输入框弹出
- 以后可能会经常用到的gulp插件
- json--eval--VM1423:3 Uncaught SyntaxError: Invalid or unexpected token
- RabbitMQ之入门HelloWorld(Java)
- AndroidTrainingCHS -- 高效显示Bitmap
- Java设计模式(2)创建型:工厂模式(工厂方法模式与抽象工厂模式)
- 支付宝支付发挥错误码4000
- C#泛型(二)
- HTML5--表单元素