我的应用包含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]'
答案 0 :(得分:0)
如果你这样做:
[self.collectionView deleteItemsAtIndexPaths:@[[self.collectionView indexPathForCell:cell]]];
并且indexPath返回nil(如果当前没有显示单元格,可能会返回),因为deleteItemsAtIndexPaths不能传递为nil,所以会出现异常。
答案 1 :(得分:0)
正如您所见,当使用indexPathForCell
时,您获得当前不可见的单元格的零索引路径。当您尝试从中创建一个数组以传递给delete方法时,这会导致崩溃。删除方法本身不会崩溃,只是制作一个数组。
您不应该使用单元格来推动更新。您需要尽快获取模型中对象的引用,并从中派生索引路径并执行删除操作。单元格只是模型表示的一部分。
查看您的代码,可能的解决方法是从cardInModel
在其数组中的位置派生索引路径(在删除它之前?)