iOS开发:如何移除图片数组中选中状态的指定元素?
解决iOS中删除勾选图片的问题
嘿,我来帮你搞定这个删除勾选图片的需求~ 先说说你现有代码里的小问题:正向遍历数组的时候删除元素会导致索引错位(后面的元素前移,会跳过某些元素),而且循环里创建UIImageView和UIButton完全没必要,删除操作只需要处理数据源数组就好。
下面给你两种靠谱的解决方案:
方案一:反向遍历删除(推荐)
反向遍历数组,这样删除元素后不会影响前面未遍历的索引,完美避免跳过元素的问题:
- (IBAction)delete_btn_touch:(id)sender { [MBProgressHUD showHUDAddedTo:self.view animated:YES]; // 从数组末尾往前遍历,避免索引错位 for (NSInteger i = _GalleryimageArry.count - 1; i >= 0; i--) { id imageItem = _GalleryimageArry[i]; // 假设你的图片项有isSelected属性(用来标记是否被勾选) if ([imageItem respondsToSelector:@selector(isSelected)] && imageItem.isSelected) { [_GalleryimageArry removeObjectAtIndex:i]; } } // 延迟隐藏HUD并刷新UI(给用户一点加载反馈) dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [MBProgressHUD hideHUDForView:self.view animated:YES]; // 刷新你的图片展示视图(比如CollectionView/TableView) [self.yourGalleryView reloadData]; }); }
方案二:先收集选中元素再批量删除
如果不想反向遍历,可以先把所有勾选的图片收集起来,再一次性删除,逻辑更直观:
- (IBAction)delete_btn_touch:(id)sender { [MBProgressHUD showHUDAddedTo:self.view animated:YES]; NSMutableArray *selectedImages = [NSMutableArray array]; for (id imageItem in _GalleryimageArry) { if ([imageItem respondsToSelector:@selector(isSelected)] && imageItem.isSelected) { [selectedImages addObject:imageItem]; } } // 批量移除选中的元素 [_GalleryimageArry removeObjectsInArray:selectedImages]; // 更新UI dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [MBProgressHUD hideHUDForView:self.view animated:YES]; [self.yourGalleryView reloadData]; }); }
特殊情况:如果数组里存的是UIImage(无选中标记)
如果你的_GalleryimageArry直接存的是UIImage对象,没有自定义的isSelected属性,那你需要单独维护一个集合记录选中的索引:
// 先声明一个属性来存选中的索引 @property (nonatomic, strong) NSMutableSet *selectedIndexes; // 删除按钮点击事件 - (IBAction)delete_btn_touch:(id)sender { [MBProgressHUD showHUDAddedTo:self.view animated:YES]; // 把索引集合转成降序数组,避免删除时索引错位 NSArray *sortedIndexes = [[self.selectedIndexes allObjects] sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) { return [obj2 compare:obj1]; // 从大到小排序 }]; for (NSNumber *indexNum in sortedIndexes) { NSInteger index = [indexNum integerValue]; if (index < _GalleryimageArry.count) { [_GalleryimageArry removeObjectAtIndex:index]; } } // 清空选中索引集合 [self.selectedIndexes removeAllObjects]; // 更新UI dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [MBProgressHUD hideHUDForView:self.view animated:YES]; [self.yourGalleryView reloadData]; }); }
最后提醒下:删除逻辑里不要创建UIImageView或UIButton,这些视图控件应该在展示图片的时候创建,删除只需要修改数据源,再刷新UI就好啦~
内容的提问来源于stack exchange,提问作者ammu
相关产品推荐
相关产品推荐

