如何删除所有项目并将新项目添加到 UICollectionView?

Posted

技术标签:

【中文标题】如何删除所有项目并将新项目添加到 UICollectionView?【英文标题】:How to remove all items and add new items to UICollectionView? 【发布时间】:2012-12-17 12:21:11 【问题描述】:

在某些事件中,

我想删除 uicollectionview 中的所有单元格,并添加新单元格。(将作为网络调用的结果填充)

我尝试使用 deleteItemsAtIndexPaths。 reloadSections、deleteSections/insertSections。

他们每个人都使我的应用程序崩溃。

下面是我的代码。

NSMutableArray* indexPathArray = [[NSMutableArray alloc] init];

for(int i=0; i < [self.jsonAlbumImageArray count]; ++i)

    NSIndexPath* newPath = [NSIndexPath indexPathForRow:i inSection:0];
    [indexPathArray addObject: newPath];


[self.jsonAlbumImageArray removeAllObjects];

if(indexPathArray.count > 0 )

    [self.collectionView performBatchUpdates:^
            [self.collectionView deleteItemsAtIndexPaths:indexPathArray];
        
    completion: nil];


// NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, 1)];                                                                                                                                                                                        
// NSIndexSet* indexSet = [NSIndexSet indexSetWithIndex:0];                                                                                                                                                                                                                 
// [self.collectionView reloadSections:indexSet];                                                                                                                                                                                                                           

[self get_IMAGE_LIST_FROM_SERVER];

【问题讨论】:

使用[collectionView reloadData] 【参考方案1】:

如果您需要比 [collectionView reloadData] 提供的更流畅的动画,您可以使用 insert 和 delete 方法来实现,这里有一个示例。

-(void)deleteItemsFromDataSourceAtIndexPaths:(NSArray  *)itemPaths

    NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet];
    for (NSIndexPath *itemPath  in itemPaths) 
        [indexSet addIndex:itemPath.row];
    
    [self.apps removeObjectsAtIndexes:indexSet];


-(void)insertItems:(NSArray*)items ToDataSourceAtIndexPaths:(NSArray  *)itemPaths

    NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet];
    for (NSIndexPath *itemPath  in itemPaths) 
        [indexSet addIndex:itemPath.row];
    
    [self.apps insertObjects:items atIndexes:indexSet];


-(void)reloadDataSmooth
        [self.collectionView performBatchUpdates:^

            NSMutableArray *arrayWithIndexPathsDelete = [NSMutableArray array];
            NSMutableArray *arrayWithIndexPathsInsert = [NSMutableArray array];

            int itemCount = [self.items count];

            for (int d = 0; d<itemCount; d++) 
                [arrayWithIndexPathsDelete addObject:[NSIndexPath indexPathForRow:d inSection:0]];
            
            [self deleteItemsFromDataSourceAtIndexPaths:arrayWithIndexPathsDelete];
            [self.collectionView deleteItemsAtIndexPaths:arrayWithIndexPathsDelete];

            int newItemCount = [newItems count];

            for (int i=0; i<newAppCount; i++) 
                [arrayWithIndexPathsInsert addObject:[NSIndexPath indexPathForRow:i inSection:0]];
            
            [self insertItems:newItems ToDataSourceAtIndexPaths:arrayWithIndexPathsInsert];

            [self.collectionView insertItemsAtIndexPaths:arrayWithIndexPathsInsert];
        
        completion:nil];
    

【讨论】:

这里的self.apps 是什么? @TejaswiYerukalapudi CollectionCells 数组(可变)【参考方案2】:

是的,正如 Jonathan 所说,我认为您想要做的是使用新数据更改您的数据源,然后简单地“刷新”或重新加载 UICollectionView。

【讨论】:

如果您完全清除数据源并执行[collectionView reloadData],应用程序不会崩溃并且集合视图将被清除,那您说什么? 如果“清除数据源”是指将其设为 0 计数对象,那么是的,这正是将会发生的事情。但是,如果将其设为“nil”,则可能会得到意想不到的结果,具体取决于您使用的是 swift 还是 obj-c。 非常感谢特拉维斯,是的,这就是我的意思:)

以上是关于如何删除所有项目并将新项目添加到 UICollectionView?的主要内容,如果未能解决你的问题,请参考以下文章

我如何将一次出现的所有项目过滤到一个列表中,并将多次出现的所有项目过滤到另一个列表中?

如何在 Visual Studio 中从 SQL 脚本创建数据库并将其添加到项目中?

如何将宏命令添加到解决方案或项目中存在的所有文件?

如何删除组合框中的所有项目? [关闭]

Flutter)我想知道如何通过按下按钮从创建的列表中删除项目

如何将include / lib目录添加到MSVC 2015解决方案中的所有项目?