- iOS11之前,UITableView有相应的方法可以给指定cell添加action。效果类似于QQ会话列表的滑动删除,置顶。实现代码
// iOS8之后的方法,即将过期可以使用iOS11新增的方法-tableView:trailingSwipeActionsConfigurationForRowAtIndexPath: 代替.
// 如果实现了该方法并且返回值不是nil,会替代 -tableView:titleForDeleteConfirmationButtonForRowAtIndexPath: 的实现
- (nullable NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewRowAction *action = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDestructive title:@"删除" handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {
[self.array removeObjectAtIndex:indexPath.row];
[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
}];
UITableViewRowAction *action2 = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleNormal title:@" 标记为未读 " handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {
}];
action2.backgroundColor = [UIColor orangeColor];
return @[action,action2];
}
效果图
效果图.png
- iOS11之后新增了更强大的方法取代上述的方法,苹果也建议使用新的方法,新的API不仅可以添加右划的action,也可以添加左划的action
- 左扫API
- (UISwipeActionsConfiguration *)tableView:(UITableView *)tableView leadingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath;
- 右扫API
- (UISwipeActionsConfiguration *)tableView:(UITableView *)tableView trailingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath;
- 示例代码
- (UISwipeActionsConfiguration *)tableView:(UITableView *)tableView leadingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath{
UIContextualAction *action = [UIContextualAction contextualActionWithStyle:UIContextualActionStyleDestructive title:@"删除" handler:^(UIContextualAction * _Nonnull action, __kindof UIView * _Nonnull sourceView, void (^ _Nonnull completionHandler)(BOOL)) {
[self.array removeObjectAtIndex:indexPath.row];
[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationBottom];
completionHandler(YES);
}];
UIContextualAction *action2 = [UIContextualAction contextualActionWithStyle:UIContextualActionStyleNormal title:@"标为已读" handler:^(UIContextualAction * _Nonnull action, __kindof UIView * _Nonnull sourceView, void (^ _Nonnull completionHandler)(BOOL)) {
completionHandler(YES);
}];
action2.backgroundColor = [UIColor orangeColor];
UIContextualAction *action3 = [UIContextualAction contextualActionWithStyle:UIContextualActionStyleNormal title:@"置顶" handler:^(UIContextualAction * _Nonnull action, __kindof UIView * _Nonnull sourceView, void (^ _Nonnull completionHandler)(BOOL)) {
completionHandler(YES);
}];
UISwipeActionsConfiguration *config = [UISwipeActionsConfiguration configurationWithActions:@[action,action2,action3]];
config.performsFirstActionWithFullSwipe = YES; // 默认值YES,控制第一个action是否支持全屏横扫(当滑动超过一定距离后会触发第一个action)
return config;
}
leading.png
- 注意点
- 对于SwipeAction的触发方法回
调中有一个completionHandler的闭包,表示处理完成的回调,应该在方法完成后调用这个闭包表示处理完成,否则会有页面样式的错误, 应该删除的cell没有消失。
- 默认情况下加入到UISwipeActionsConfiguration中的第一个action会有全屏手势的功能,也就是当滑动出来菜单后继续滑动会触发第一个action,如果不想要这个功能可以设置属性performsFirstActionWithFullSwipe为NO即可
UISwipeActionsConfiguration *config = [UISwipeActionsConfiguration configurationWithActions:@[action,action2,action3]];
config.performsFirstActionWithFullSwipe = NO;
网友评论