iOS:多个单元格的删除(方法一)

采用存取indexPath的方式,来对多个选中的单元格进行删除

删除前:                      

删除后:

  分析:如何实现删除多个单元格呢?这需要用到UITableView的代理方法,即选中单元格时对单元格做的处理,同时我们也要定义一个可变的数组,用来存储选中的数据,以便后来的删除。这里采用存储indexPath的方式,因为每选中一个单元格时,它都对应着一个indexPath,同时,将选中的单元格添加指引视图,即打对勾,也要判断打对勾是否重复,根据此来显示单元格的标记。最后,将标记的数据全部在原数据库中删除,同时在清空存储数据的数组,刷新表格即可。删除过程中,涉及到排序问题,下面的代码中将有介绍。

  1 #import "ViewController.h"
  2 #define NUM 20
  3 @interface ViewController ()<UITableViewDataSource,UITableViewDelegate>
  4 @property (strong,nonatomic)NSMutableArray *products;       //原始的产品库存
  5 @property (strong,nonatomic)NSMutableArray *cellIndexPaths;  //存放选中的单元格
  6 @property (weak, nonatomic) IBOutlet UITableView *tableView;
  7 - (IBAction)deleteButtonClicked:(UIBarButtonItem *)sender;
  8
  9 @end
 10
 11 @implementation ViewController
 12
 13 - (void)viewDidLoad {
 14     [super viewDidLoad];
 15     //初始化
 16     self.products = [NSMutableArray arrayWithCapacity:NUM];
 17     self.cellIndexPaths = [NSMutableArray arrayWithCapacity:NUM];
 18     for(int i=0; i<NUM; i++)
 19     {
 20         NSString *product = [NSString stringWithFormat:@"product-%02d",i];
 21         [self.products addObject:product];
 22     }
 23
 24     //设置数据源和代理
 25     self.tableView.dataSource  = self;
 26     self.tableView.delegate = self;
 27 }
 28
 29 //删除所有选中的单元格的IndexPath
 30 //说明:在每一次进行删除的时候,如果总是从数组的后面删除,结果是没有影响的,但是,如果从前面开始删除的话,那么数组中后面的元素会依次向前递进,此时它们的indexPath就全改变了,结果就会出问题。此时,就需要对选中的元素进行排序操作。
 31 - (IBAction)deleteButtonClicked:(UIBarButtonItem *)sender
 32 {
 33     //对选中的元素进行排序操作(按升序排列)
 34     [self.cellIndexPaths sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
 35         NSIndexPath *ip1 = (NSIndexPath*)obj1;
 36         NSIndexPath *ip2 = (NSIndexPath*)obj2;
 37         if(ip1.row == ip2.row)
 38         {
 39             return NSOrderedSame;
 40         }
 41         else if(ip1.row > ip2.row)
 42         {
 43             return NSOrderedDescending;
 44         }
 45         else
 46         {
 47             return NSOrderedAscending;
 48         }
 49
 50     }];
 51
 52     //1.从原始数据中删除选中的单元格中的产品(倒着删除)
 53     [self.cellIndexPaths enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
 54         [self.products removeObjectAtIndex:((NSIndexPath*)obj).row];
 55     }];
 56
 57     //2.清空记录选中的数组
 58     NSArray *tempArray = [NSArray arrayWithArray:self.cellIndexPaths];
 59     [self.cellIndexPaths removeAllObjects];
 60
 61     //3.进行局部的刷新
 62     [self.tableView deleteRowsAtIndexPaths:tempArray withRowAnimation:UITableViewRowAnimationLeft];
 63 }
 64
 65 #pragma mark -tableView的数据源方法
 66 //每一个section有多少个row
 67 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
 68 {
 69     return self.products.count;
 70 }
 71 //设置每一个单元格的内容
 72 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
 73 {
 74     //1.根据reuseIdentifier,先到对象池中去找重用的单元格对象
 75     static NSString *reuseIdentifier = @"productCell";
 76     UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
 77     //2.如果没有找到,自己创建单元格对象
 78     if(cell == nil)
 79     {
 80         cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier];
 81     }
 82     //3.设置单元格对象的内容
 83     cell.textLabel.text = self.products[indexPath.row];
 84
 85     if([self.cellIndexPaths containsObject:indexPath]) //初次选中时,标记一下
 86     {
 87         cell.accessoryType = UITableViewCellAccessoryCheckmark;
 88     }
 89     else //再次选中时,取消标记
 90     {
 91         cell.accessoryType = UITableViewCellAccessoryNone;
 92     }
 93
 94     return cell;
 95 }
 96
 97 #pragma mark -tableView的代理方法
 98 //对选中的单元格的处理
 99 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
100 {
101     //1.取出当前单元格
102     UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
103
104     //3.将取出的单元格所在的indexPath添加到数组中,并给单元格添加辅助指引视图
105     if([self.cellIndexPaths containsObject:indexPath])  //已经存在
106     {
107         cell.accessoryType = UITableViewCellAccessoryNone;
108
109         //从数组中删除
110         [self.cellIndexPaths removeObject:indexPath];
111     }
112     else
113     {
114         cell.accessoryType = UITableViewCellAccessoryCheckmark;
115
116         //添加到数组中
117         [self.cellIndexPaths addObject:indexPath];
118     }
119 }
120
121 @end
时间: 2024-12-14 10:30:56

iOS:多个单元格的删除(方法一)的相关文章

iOS:多个单元格的删除(方法二):

前面介绍了万无一失的方法一,这里介绍删除单元格的第二种方式,通过删除单元格中的内容的方式进行操作:(但是这种情况有一个小的弊端,由于单元格重用机制,如果单元格内容一样时,标记的存在会造成误删) 删除前: 删除后: 分析如下:(如果每一个单元格内容都不一样)采取删除单元格内容的方式是比较简单的方式,那么如何实现多个单元格的删除呢? 首先,定义两个必要的可变的数组,一个是用来存储初始化原始数据的,另一个是用来存储选中单元格后,从里面取出来的数据: 其次,通过数据源的方法将原始数据显示在表格中,同时通

UITableView单元格不见删除按钮

现象:初学使用tableview的时候,进行单元格的删除操作,发现点击编辑的时候,或者滑动单元格的时候,左边的红色减号可以出来,但是右边的删除按钮却没有出来. 原因:这是一个低级错误,初学对布局不熟的时候,可能会犯,其实不是删除按钮没出来,而是删除按钮藏在屏幕之外了,不信你转动屏幕为横屏试试,说不定可以看到哦! 解放方法:将tableview的布局reset为建议约束.

IOS 取消表格单元格 TableViewCell 去掉高亮状态 点击Cell取消选择状态

以下是两种实现效果 1. 自定义cell 继承UITableViewCell 重写 -(void)setSelected:(BOOL)selected animated:(BOOL)animated { } -(void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { } 里面不写任何东西 注意重写的时候一定要有带animated 方法,不然还是无效 2.点击单元格 取消选中单元格 //  点击单元格的时候取消选中单元格 -(

UITableViewCell单元格的删除、插入、移动

UITableViewDelegate的方法 设置编辑模式中得cell的编辑样式(删除或插入) - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath; UITableViewDataSource的方法            设置该单元格能否被编辑 - (BOOL)tableView:(UITableView *

iOS笔记【单元格右滑手势】 2017-09-09

// 响应单元格右滑手势 override func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? { let actionShare = UITableViewRowAction(style: .normal, title: "分享") { (_,IndexPath) in // 定义滑动菜单样式和标题 let ac

iOS:UITableViewCell自定义单元格

UITableViewCell:自定义的单元格,可以在xib中创建单元格,也可以在storyBorad中创建单元格.有四种创建方式 <1>在storyBorad中创建的单元格,它是静态的单元格,单元格一开始就存在,可以直接根据自定义的重用标识名加载使用: <2>当然,storyBorad中单元格也可以关联一个自定义的类,这个类必须是继承UITableViewCell,这种情况下,直接根据自定义的重用标识名加载使用也是可以的. <3>在xib中创建的单元格,如果直接通过b

iOS集合视图单元格高亮和选中的区别

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流之用,请勿进行商业用途.同时,转载时不要移除本申明. 如产生任何纠纷,均与本博客所有人.发表该翻译稿之人无任何关系.谢谢合作! 集合视图(Collection View)拥有一个遵守UICollectionViewDelegate协议的delegate属性.该委托属性将从集合视图接收到各种委托调用

iOS中表视图单元格事件用nib和storyboard的两种写法总结

从ios6开始,苹果公司推出了storyborad技术取代了nib的写法,这样代码量确实少写了很多,也比较简洁.但是,从学习的角度来说,阿堂认为 用nib的写法,虽然多了些代码,但是对于掌握知识和原理的角度来说,我认为nib写法也挺不错的.用storyborad的写法时,如果segue场景 较多的话,设置有问题的话,会导致一些异常的发生,增加调试的难度.下面阿堂亲自了测试了nib和storyboard的两种写法的demo.下面将其差 异之处简单对比了下,供有需掌握的网友了解下. demo效果图如

HTML中Table行单元格的删除、增加、修改、确定

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Typ