15 May 2015

启用TableViewCell的滑动删除


问题


想让APP用户能从TableView中轻松删除行。

方案


在TableView的delegate中实现tableView:editingStyleForRowAtIndexPath:方法。

在dataSource中实现tableView:commitEditingStyle:forRowAtIndexPath:方法。

/ TableViewController.h /

import <UIKit/UIKit.h>

@interface TableViewController : UIViewController <UITableViewDataSource, UITableViewDelegate> @property (nonatomic, strong) UITableView myTableView; @property (nonatomic, strong) NSMutableArray arrayOfRows; @end

/ TableViewController.m / - (void)viewDidLoad { [super viewDidLoad]; self.myTableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain]; self.myTableView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; self.myTableView.dataSource = self; self.myTableView.delegate = self; [self.view addSubview:self.myTableView];

self.arrayOfRows = [@[@"abc", @"def", @"hig"] mutableCopy];

}

  • (UITableViewCellEditingStyle)tableView:(UITableView )tableView editingStyleForRowAtIndexPath:(NSIndexPath )indexPath { UITableViewCellEditingStyle result = UITableViewCellEditingStyleNone;

    if ([tableView isEqual:self.myTableView]) { result = UITableViewCellEditingStyleDelete; }

    return result; }

  • (void)setEditing:(BOOL)editing animated:(BOOL)animated { [super setEditing:editing animated:animated]; [self.myTableView setEditing:editing animated:animated]; }

  • (void)tableView:(UITableView )tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath )indexPath { if (editingStyle == UITableViewCellEditingStyleDelete) { if (indexPath.row < [self.arrayOfRows count]) { [self.arrayOfRows removeObjectAtIndex:indexPath.row]; [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationLeft]; } } }

tableView:editingStyleForRowAtIndexPath:方法能够启动删除功能,它被tableView调用,同时它的返回值决定了tableView允许用户做什么(插入,删除等)。

tableView:commitEditingStyle:forRowAtIndexPath:方法实现用户要求的删除。后一种方法在委托中定义,但是它的功能有点重载:不只使用这方法删除数据,也必须要从表中删除行。

讨论


TableView通过在目标行右侧显示一个按钮来响应滑动(图4-6)。正如你所看到的,TableView不在编辑模式下,但按钮允许用户删除行。

TableView-6

图4-6. 删除键出现在TableView单元格中

通过执行tableView:editingStyleForRowAtIndexPath:(在UITableViewDelegate声明)方法能够启动这个模式,它的返回值说明了表中是否应该允许同时插入与删除或者同时不。通过实现TableView的数据源中的tableView:commitEditingStyle:forRowAtIndexPath:方法,你将会得到通知(如果用户完成了插入或者删除操作的话)。

deleteRowsAtIndexPaths:withRowAnimation:方法的第二个参数允许你指定一个动画方法,当行从TableView中删除时这个动画方法会被执行。我们的示例说明了当行被删除时它在从右到左的移动过程中消失。



blog comments powered by Disqus