更新滚动的UICollectionView中的单元格 - 删除屏幕外单元格时应用程序崩溃

时间:2013-06-17 01:17:31

标签: ios xcode scroll uicollectionview

我的应用包含UICollectionView,可显示卡片匹配游戏的多个自定义子视图。基本上,当三张卡匹配时,包含它们的单元格将从集合视图中删除。当可滚动屏幕上显示所有三个单元格时,我的删除功能有效,但当一个或两个单元格不在屏幕上时,我的删除功能无效。会发生什么事情是屏幕上的单元格会被删除,但是当我尝试向上滚动其他的那些(也应该被删除)时,应用程序崩溃了。

以下是我的卡片更新功能的代码:

- (void) updateCell: (SetCardCell*) cell withCard: (SetsCard *) cardInModel {
    if ([cell isKindOfClass: [SetCardCell class]]){
        if ([cell.setCardView isKindOfClass:[SetCardView class]]) {

            // various actions to match view with model

            SetCardView *cardView = cell.setCardView;
            [cardView setNeedsDisplay];

            // do things to UI if card is faced up or unplayable

            if (!cardInModel.isUnplayable) {
                if (cardInModel.isFaceUp) {
                    cell.setCardView.alpha = 0.3;
                } else {
                    cell.setCardView.alpha = 1;
                }
            } else {
                // remove the cell - this is where the problem is

                NSLog(@"%@", cell.description);  ** returns a cell ** 
                NSLog(@"%@", [self.collectionView indexPathForCell:cell].description); ** returns (null) when the cell is offscreen, but a normal index path if otherwise **

                [self.game.cards removeObjectsInArray:@[cardInModel]];
                [self.collectionView deleteItemsAtIndexPaths:@[[self.collectionView indexPathForCell:cell]]];
            }
        }
    }
}

有关如何解决此问题的任何想法?非常感谢你!

编辑:我忘记了如下引发的错误消息:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSPlaceholderArray initWithObjects:count:]: attempt to insert nil object from objects[0]'

2 个答案:

答案 0 :(得分:0)

如果你这样做:

[self.collectionView deleteItemsAtIndexPaths:@[[self.collectionView indexPathForCell:cell]]];

并且indexPath返回nil(如果当前没有显示单元格,可能会返回),因为deleteItemsAtIndexPaths不能传递为nil,所以会出现异常。

答案 1 :(得分:0)

正如您所见,当使用indexPathForCell时,您获得当前不可见的单元格的零索引路径。当您尝试从中创建一个数组以传递给delete方法时,这会导致崩溃。删除方法本身不会崩溃,只是制作一个数组。

您不应该使用单元格来推动更新。您需要尽快获取模型中对象的引用,并从中派生索引路径并执行删除操作。单元格只是模型表示的一部分。

查看您的代码,可能的解决方法是从cardInModel在其数组中的位置派生索引路径(在删除它之前?)