从 UICollectionView 中删除一个项目

Posted

技术标签:

【中文标题】从 UICollectionView 中删除一个项目【英文标题】:Remove an item from a UICollectionView 【发布时间】:2013-04-18 10:20:39 【问题描述】:

我在UICollectionView 中显示了一组图像。当用户点击图像时,它会生成一个UIActionSheet,其中包含该图像的一些选项。其中一个从UICollectionView 中删除了照片。当用户在UIActionSheet 中选择删除按钮时,它会弹出一个警报视图,要求确认。如果用户选择是,它应该删除照片。

我的问题是,要从UICollectionView 中删除项目,您必须将indexPath 传递给deleteItemsAtIndexPaths 事件。由于在警报视图的didDismissWithButtonIndex 事件中授予了最终确认,因此我无法找到一种方法从那里获取所选图像的indexPath 以将其传递给deleteItemsAtIndexPaths 事件。我该怎么做?

这是我的代码:

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex

    switch (buttonIndex) 
        case 0:
            deletePhotoConfirmAlert = [[UIAlertView alloc] initWithTitle:@"Remove Photo"
                                                                 message:@"Do you want to remove this photo?"
                                                                delegate:self
                                                       cancelButtonTitle:@"Cancel"
                                                       otherButtonTitles:nil, nil];
            [deletePhotoConfirmAlert addButtonWithTitle:@"Yes"];
            [deletePhotoConfirmAlert show];

            break;
        case 1:
            NSLog(@"To Edit photo");
            break;
    


- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex

    if (alertView == deletePhotoConfirmAlert) 
        if (buttonIndex == 1) 
            // Permission to delete the button is granted here.
            // From here deleteItemsAtIndexPaths event should be called with the indexPath
        
    


- (void)deleteItemsAtIndexPaths:(NSArray *)indexPaths



【问题讨论】:

【参考方案1】:

为什么不使用 [self.collectionView indexPathsForSelectedItems]; 。我这样做是为了一次删除多个图像。

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex 
  if (alertView == deletePhotoConfirmAlert) 
    if (buttonIndex == 1) 
        // Permission to delete the button is granted here.
        NSArray *selectedItemsIndexPaths = [self.collectionView indexPathsForSelectedItems];

       // Delete the items from the data source.
        [self deleteItemsFromDataSourceAtIndexPaths:selectedItemsIndexPaths];

        // Now delete the items from the collection view.
        [self.collectionView deleteItemsAtIndexPaths:selectedItemsIndexPaths];
    
  


// This method is for deleting the selected images from the data source array
-(void)deleteItemsFromDataSourceAtIndexPaths:(NSArray  *)itemPaths 
   NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet];
   for (NSIndexPath *itemPath  in itemPaths) 
     [indexSet addIndex:itemPath.row];
   
   [self.images removeObjectsAtIndexes:indexSet]; // self.images is my data source

编辑

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
   NSArray *indexpaths = [self.collectionView indexPathsForSelectedItems];
   DetailViewController *dest = [segue destinationViewController];
   dest.imageName = [self.images objectAtIndex:[[indexpaths objectAtIndex:0] row]];

【讨论】:

我收到一个No visible @interface for 'SomeViewController' 在[self deleteItemsFromDataSourceAtIndexPaths:selectedItemsIndexPaths]; 行声明选择的'deleteItemsFromDataSourceAtIndexPaths' 错误。 对不起,我忘了指出 deleteItemsFromDataSourceAtIndexPaths 是我的自定义函数,用于从我的数据源数组中删除所选图像。您可以直接在那里进行操作。 Anwy 在调用 deleteItemsAtIndexPaths: 之前从数据源数组中删除图像很重要 我明白了。现在我正在尝试使用removeObjectAtIndex 从数据源数组中删除图像。但由于它需要一个整数值,我怎样才能从 selectedItemsIndexPaths 数组中得到它? 完美运行。非常感谢,阿尼尔 :) 您好,有没有办法从NSMutableIndexSet 中获取单个索引?

以上是关于从 UICollectionView 中删除一个项目的主要内容,如果未能解决你的问题,请参考以下文章

通过 NSNotification 从 UICollectionView 中删除单元格

如何快速从 UICollectionView 中的 UIView 中删除焦点阴影?

为啥我不能从我的 UICollectionView 中删除图像?

从 UICollectionView 中的 UIAttachmentBehavior 中删除振荡

从 UICollectionView 中删除单元格而不从顶部重新加载 [关闭]

UICollectionView reloadSection 不会从视图层次结构中删除旧视图