从uitableview中选择多行并删除

Posted

技术标签:

【中文标题】从uitableview中选择多行并删除【英文标题】:select multiple rows from uitableview and delete 【发布时间】:2011-02-10 07:18:15 【问题描述】:

我正在表格视图中显示项目列表。我需要一次从表格中选择和删除多行,有关如何执行此操作的任何资源

【问题讨论】:

【参考方案1】:

我假设您的桌子只有一个部分。您可以很容易地将此​​解决方案扩展到多个部分。

向管理 TableView 的 UIViewController 子类添加 NSMutableSet 成员“selectedRows” 在- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 中切换 indexPath.row 在“selectedRows”中的成员资格,如下所示:

NSNumber *rowNsNum = [NSNumber numberWithUnsignedInt:indexPath.row];
if ( [self.selectedRows containsObject:rowNsNum] )
    [self.selectedRows removeObject:rowNsNum];
else 
    [self.selectedRows addObject:rowNsNum];
直观地指示选择了一行(例如,将单元格的附件类型属性设置为 UITableViewCellAccessoryCheckmark),或以其他方式直观地修改您的单元格以指示它是一个选定的行 在您的 UI 中添加一个“删除”按钮,可以在表格部分的页眉/页脚、标题栏、任何地方,连接到名为“deleteRows”的选择器 在您的 deleteRows 方法中,遍历 selectedRows 集,构建一个 indexPaths 数组,从您的数据模型中删除这些行,然后调用(使用您喜欢的动画类型):

[self.myTableView deleteRowsAtIndexPaths:arrayOfIndexPathsToDelete withRowAnimation:UITableViewRowAnimationTop];    

编辑: 这是我完整的 didSelectRowAtIndexPath 方法。正确操作可能需要 deselectRowAtIndexPath。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

    if ( self.editing )
        return;

    [self.myTableView deselectRowAtIndexPath:indexPath animated:YES];

    NSNumber *rowNsNum = [NSNumber numberWithUnsignedInt:indexPath.row];
    if ( [self.selectedRows containsObject:rowNsNum] )
        [self.selectedRows removeObject:rowNsNum];
    else 
        [self.selectedRows addObject:rowNsNum];

    [self.myTableView performSelector:@selector(reloadData) withObject:nil afterDelay:0.2];

【讨论】:

我在执行此操作时遇到了问题,我在选择要删除的单元格时设置了要显示的单元格图像,但是只有在我将单元格滚动到视图之外然后制作它后才会刷新此视图回来,怎么同时刷新cellimage? 您可以使用 [tableView reloadData]; 强制重新加载表格视图。我在更新 didSelectRowAtIndexPath 中的单个单元格时遇到了问题(视觉故障),再次通过调用 reloadData 解决了。有时,我使用的一个技巧是使用 performSelector:withObject:afterDelay 对 reloadData 进行延迟调用,有时这是让表再次“正常”的唯一方法。 谢谢,我面临的另一个问题是,在上面的 if else 条件下,只有 else 部分一直在工作,请帮助,我记录并检查了集合中的值,但第一个条件不工作 我在编辑的答案中添加了完整的方法,也许这会有所帮助。 "if" 部分只会在被选中的行之前被选中时被调用。 @Bogatyr 所以在调用 deleteRowsAtIndexPaths 时,我们应该传递的数组是 self.selectedRows 在这种情况下,对吗?【参考方案2】:
#import "ViewController.h"
#import "TableViewCell.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UITableView *tblView;
@property (strong,nonatomic)NSMutableArray *arryData1,*arryData2;
@property (strong,nonatomic)UIBarButtonItem *edit,*delete;
@end

@implementation ViewController

    BOOL Selected;

- (void)viewDidLoad 
    [super viewDidLoad];
    self.arryData1 = [[NSMutableArray alloc] initWithObjects:@"MCA",@"MBA",@"BTech",@"MTech",nil];
        self.arryData2 = [[NSMutableArray alloc] initWithObjects:@"Objective C",@"C++",@"C#",@".net",nil];

    self.edit=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemEdit target:self action:@selector(edit:)];
    self.navigationItem.leftBarButtonItem=self.edit;
    self.delete=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemTrash target:self action:@selector(delete:)];
    self.navigationItem.rightBarButtonItem=self.delete;
    self.tblView.allowsMultipleSelection=YES;

    

-(void)edit:(id)sender

    Selected=YES;
    [self.tblView reloadData];

-(void)delete:(id)sender

    NSArray *selectedCells = [self.tblView indexPathsForSelectedRows];
    NSMutableIndexSet *indicesToDelete = [[NSMutableIndexSet alloc] init];
    for (NSIndexPath *indexPath in selectedCells) 
        [indicesToDelete addIndex:indexPath.row];
    
    //arrayFromPlist is NSMutableArray
    [self.arryData1 removeObjectsAtIndexes:indicesToDelete];
    [self.tblView beginUpdates];
    [self.tblView deleteRowsAtIndexPaths:selectedCells withRowAnimation:UITableViewRowAnimationAutomatic];
    [self.tblView endUpdates];



- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath

    // Remove the row from data model
    [self.arryData1 removeObjectAtIndex:indexPath.row];

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    
        return 1;
    

    -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    
        return [self.arryData1 count];
    



 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    
        static NSString *CellIdentifier= @"Cell";

        TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil)
        
            cell = [[TableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] ;
        
        if (Selected==YES) 
            cell.imageView.image=[UIImage imageNamed:@"trash.png"];
        
        else
        
            cell.imageView.image=nil;
        
        cell.textLabel.text = [self.arryData1 objectAtIndex:indexPath.row];
        cell.detailTextLabel.text = [self.arryData2 objectAtIndex:indexPath.row];

        return cell;
    

@end

【讨论】:

在编辑按钮上单击单元格图像发生变化,只需选择多行然后单击删除按钮,您将看到所有选定的单元格行都被删除。 在你的回答中添加解释如何解决问题 这只是问题帖子中的一个示例“我在 tableview 中显示项目列表。我需要一次从表中选择和删除多行,有关如何执行此操作的任何资源"

以上是关于从uitableview中选择多行并删除的主要内容,如果未能解决你的问题,请参考以下文章

如何从Storyboard中创建的静态UITableView中删除单元格

iphone中的UITableView中的多行选择和删除,就像iphone中的邮件应用程序一样

如何在 UITableViewCell 中添加多行文本字段?

如何从 UITableView 中获取对象 id 并根据对象 id 删除对象?

在 Swift 中,如何从 UITableView 中获取对象 id 并根据对象 id 删除对象?

UITableView 在删除一行或多行后留下空白单元格的模式