在以往的惯性思维中,对于批量删除的操作一直以为是标记被选中的Cell 控件
进行删除,但往往前面被选中的Cell
会被后面显示的Cell
复用,导致后面显示的Cell
也是被勾选中的状态,如果我们对被选中的数据模型
进行标记删除,则不会出现上述cell
被复用的情况。
第一种方式:
第一步: 在数据模型中添加一个标记的属性
#import <Foundation/Foundation.h>
@interface SourceModel : NSObject
@property (strong, nonatomic) NSString *buyCount;
@property (strong, nonatomic) NSString *price;
@property (strong, nonatomic) NSString *title;
@property (strong, nonatomic) NSString *icon;
/** 状态量标识有无被打钩 */
@property (assign, nonatomic, getter=isChecked) BOOL checked;
+ (instancetype)dealWithDict:(NSDictionary *)dict;
@end
第二步:在cell设置属性中,设置打勾
的视图是否显示,在Xib
中默认是隐藏状态。
- (void)setSourceModel:(SourceModel *)sourceModel{
_sourceModel = sourceModel;
self.iconView.image = [UIImage imageNamed:sourceModel.icon];
self.pricesLabel.text = [NSString stringWithFormat:@"¥%@", sourceModel.price];
self.titleLabel.text = sourceModel.title;
self.buycountLabel.text = [NSString stringWithFormat:@"%@人已购买", sourceModel.buyCount];
// 设置打钩控件的显示和隐藏
self.checkView.hidden = !sourceModel.isChecked;
}
第三步:遍历整个模型数组中被选中的数据,并将被选中的数据添加到一个临时的数组中tempArray
,并删除模型数据中的被选中的数组模型。
// 批量删除数据
- (IBAction)removeSources:(id)sender {
//建立一个临时数组来存储需要被选中的删除数据
NSMutableArray * tempArray = [NSMutableArray array];
for (SourceModel *sources in self.sourceArray) {
if (sources.checked) {
[tempArray addObject:sources];
}
}
// 删除模型数组里的被选中的数组
[self.sourceArray removeObjectsInArray:tempArray];
[self.tableView reloadData];
}
第二种方式:
第一步:添加一个将要被删除的模型数组@property (nonatomic,strong)NSMutableArray *deleteArray;
,并且判断deleteArray
中是否包含了被选中的模型数据
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
// 取消选中某一行
[tableView deselectRowAtIndexPath:indexPath animated:YES];
SourceModel *sourceModel = self.sourceArray[indexPath.row];
if ([self.deleteArray containsObject:sourceModel]) {//数组中包含了被选中的
[self.deleteArray removeObject:sourceModel];
}else {
[self.deleteArray addObject:sourceModel];
}
[tableView reloadData];
}
第二步:将sourceArray
的数组模型里删除deleteArray
,并将deleteArray
清空,否则deleteArray
的数组一直增加元素。
// 批量删除数据
- (IBAction)removeSources:(id)sender {
// 从数据数组中删除被选中的模型数组
[self.sourceArray removeObjectsInArray:self.deleteArray];
[self.tableView reloadData];
//清空将要删除的数组模型,
[self.deleteArray removeAllObjects];
}
第三种方式:这种方式是苹果自带的批量删除操作,依据被选中的行号进行删除 ,其可定制性比较差。
第一步:允许
TableView
进行多选操作。
- (void)viewDidLoad {
[super viewDidLoad];
// 允许在编辑模式下进行多选操作
self.tableView.allowsMultipleSelectionDuringEditing = YES;
第二步:批量选中操作。
//批量选中
- (IBAction)multiOperation:(id)sender {
[self.tableView setEditing:!self.tableView.isEditing animated:YES];
}
第三步:将选中的数据进行删除。
//删除数据
- (IBAction)removeSources:(id)sender {
// 获取被选中的行号
NSArray *indexPaths = [self.tableView indexPathsForSelectedRows];
//便利所有的行号
NSMutableArray *deleteArray = [NSMutableArray array];
for (NSIndexPath *paths in indexPaths) {
[deleteArray addObject:self.sourceArray[paths.row]];
}
// 删除被选中的行号模型数据
[self.sourceArray removeObjectsInArray:deleteArray];
[self.tableView reloadData];
}