0

我的应用程序包含一个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]'

4

2 回答 2

0

如果你这样做:

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

并且 indexPath 返回 nil(如果当前未显示单元格,则可能会返回),您将收到异常,因为 deleteItemsAtIndexPaths 不能传递 nil。

于 2013-06-17T01:39:04.813 回答
0

如您所见,您会得到一个单元格的 nil 索引路径,该路径在使用indexPathForCell. 当您尝试从中创建一个数组以传递给 delete 方法时,这会导致崩溃。delete 方法本身并没有崩溃,只是创建了一个数组。

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

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

于 2013-06-17T06:36:11.243 回答