自iOS8开始,TableView支持多个左滑按钮的显示效果。如果只是简单的文字显示效果,只需简单的几行代码即可轻松实现。
1.简单左滑效果
实现基本的左滑效果十分简单,只需重写
UITableViewDataSource中的
- (void)tableView: commitEditingStyle: forRowAtIndexPath:
方法即可。
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (UITableViewCellEditingStyleDelete == editingStyle)
{
[self.dataArr removeObjectAtIndex:indexPath.row];
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationTop];
}
}
当然,显示的文字是可以换的,需要重写即可,返回值即为显示的文字。
- (nullable NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath
注意:
1.删除或添加都会回调此方法,故需要UITableViewCellEditingStyleDelete == editingStyle
的条件
2.重写此方法会有左滑效果,点击左滑出的按钮则会调用此方法中的内容,默认左滑按钮点击是删除。在手机为中文系统时Delete
会自动变为删除
字样。
3.对tableview的row进行增加或减少,必须同时对数据源进行改变做到一一对应。
4.如果只需要部分才可以左滑,则需要重写
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath;
,返回YES表示可以左滑,反之不能左滑。
2.多按钮左滑效果
当需要左滑显示多个按钮时,上面的方法已经不能满足需求了。但是API提供了另一个方法供我们使用(此方法iOS8后才可以使用)。
此时只需重写
- (NSArray<UITableViewRowAction *> *)tableView: editActionsForRowAtIndexPath:
- (NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewRowAction *action1 = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleNormal title:@"第一个" handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath)
{
//删除一行
[self.dataArr removeObjectAtIndex:indexPath.row];
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationTop];
}];
action1.backgroundColor = [UIColor greenColor];
UITableViewRowAction *action2 = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleNormal title:@"Second" handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath)
{
//什么都不做,恢复原样
[tableView setEditing:NO animated:YES];
}];
action2.backgroundColor = [UIColor orangeColor];
return @[action1,action2];
}
注意:
1.当重写此方法时commitEditingStyle
以及titleForDeleteConfirmationButtonForRowAtIndexPath
不会被调用。故实现此方法后,其他方法不必实现。
2.若不需要删除某行,只需恢复原样,调用[tableView setEditing:NO animated:YES];即可。因为左滑后,tableView的editing会自动变为YES。
3.UITableViewRowAction只有一些简单属性可以设置,比如背景颜色backgroundColor
。
4.返回的数组中,越靠前的元素显示越靠右。
5.显示的宽度和字数会自动适配,不需调整。