从collectionView中删除单元格时出现NSInternalInconsistencyException

时间:2016-02-15 07:01:25

标签: ios objective-c cocoa-touch uicollectionview

我想从UICollectionView中删除一个单元格。删除单元格时我得到了

  

***由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'无效更新:第0节中的项目数无效。更新后的现有部分中包含的项目数(5)必须等于更新前该部分中包含的项目数(5),加上或减去从该部分插入或删除的项目数(插入0,删除1),加上或减去移入或移出该部分的项目数量( 0移入,0移出)。'错误。

这是我的代码:

[self.imgArray removeObjectAtIndex:indexForDelete];

[self.collectionView performBatchUpdates:^{

     NSIndexPath *indexPath =[NSIndexPath indexPathForItem:indexForDelete inSection:0];
     [self.collectionView deleteItemsAtIndexPaths:[NSArray arrayWithObject:indexPath]];
    } completion:^(BOOL finished) {

 }];

当我的数组计数不是5时,我会附加一个虚拟单元格 这是numberOfItemsInSection

中numberOfItems的代码
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    if(self.imgArray.count == 5)
    {
        return  self.imgArray.count ;
    }
    else
    {
        return  self.imgArray.count + 1;
    }

}

我在Google和Stackoverflow上找到了很多解决方案,但没有找到任何帮助。

2 个答案:

答案 0 :(得分:0)

performBatchUpdates 主要用于为多个单元格执行操作。即删除,插入,移动。

试试这个,

[self.collectionObj performBatchUpdates:^{

    [self.imgArray removeObjectAtIndex:indexForDelete];

    NSIndexPath *indexPath =[NSIndexPath indexPathForItem:indexForDelete inSection:0];
    [self.collectionView deleteItemsAtIndexPaths:[NSArray arrayWithObject:indexPath]];

    [self.collectionView reloadData];

} completion:^(BOOL finished) {

}];

您也可以直接尝试删除1个单元格而不使用 performBatchUpdates

    [self.imgArray removeObjectAtIndex:indexForDelete];

    NSIndexPath *indexPath =[NSIndexPath indexPathForItem:indexForDelete inSection:0];
    [self.collectionView deleteItemsAtIndexPaths:[NSArray arrayWithObject:indexPath]];

    [self.collectionView reloadData];

希望,这会对你有所帮助。
感谢

答案 1 :(得分:0)

我认为您可能需要将更新分为两个阶段以避免NSInternalInconsistencyException。

@property (assign, nonatomic) BOOL isMyCollectionViewUpdating;

//...

[self.imgArray removeObjectAtIndex:indexForDelete];

[self.collectionView performBatchUpdates:^{

     self.isMyCollectionViewUpdating = YES; 

     NSIndexPath *indexPath =[NSIndexPath indexPathForItem:indexForDelete inSection:0];
     [self.collectionView deleteItemsAtIndexPaths:[NSArray arrayWithObject:indexPath]];
} completion:^(BOOL finished) {
        self.isMyCollectionViewUpdating = NO;
        [self.collectionView reloadData];
}];

和集合视图numberOfItemInSection

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
    {
        if (self.isMyCollectionViewUpdating)
        {
            return self.imgArray.count;
        } else {
            if(self.imgArray.count == 5)
            {
                return  self.imgArray.count ;
            }
            else
            {
                return  self.imgArray.count + 1;
            }
        }


    }