我正在尝试执行以下操作:
A)级别1已解锁(包含未锁定级别的背景图像)。
B)级别2-20被锁定(包含另一个背景图像)。随着每个连续的级别完成,它们将被解锁。
最初,当我运行应用程序并转到我的UICollectionView
时,一切看起来都不错。当我玩第1级并完成它时,我保存(通过核心数据)NSNumber
被称为levelLocked
的被管对象的数字0,现在属于第2级(0表示已解锁,其他级别) 3-20应该用1)锁定。
保存关卡是锁定还是解锁的过程有效。但是当我回到我的UICollectionView
时,我看不到第2级的物理变化(它仍然有锁的背景图像)。
此外,如果我在ViewController
之前返回UICollectionView
,然后重新输入UICollectionView
,应用程序会因错误而崩溃:
*** Assertion failure in -[UICollectionView _createPreparedCellForItemAtIndexPath:withLayoutAttributes:applyAttributes:],
看来我的单元格没有正确更新(我不知道如何正确地重新加载数据)。我确实为解锁和锁定级别类型注册了自定义UICollectionViewCell
nib。我检查了所有拼写(如果这是问题,那么第一次开始时它就不会有效)。
这里是细胞生成的代码。
static NSString *cellIdentifier = @"tortoiseCell";
static NSString *tortIdentifier = @"tortoiseLocked";
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView
cellForItemAtIndexPath:(NSIndexPath *)indexPath {
UICollectionViewCell *regular;
NSMutableArray *data = [self.dataArray objectAtIndex:indexPath.section];
NSString *cellData = [data objectAtIndex:indexPath.row];
NSMutableArray *ar = [self.lockArray objectAtIndex:indexPath.section];
NSNumber *arLocks = [ar objectAtIndex:indexPath.row];
if ([arLocks integerValue] == 0) {
TortoiseCell *cell = (TortoiseCell *)[collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];
[cell.buttonClick setTag:indexPath.row];
[cell.buttonClick setTitle:cellData forState:UIControlStateNormal];
[cell.buttonClick setBackgroundImage:[UIImage imageNamed:@"TortoiseLevels.png"]
forState:UIControlStateNormal];
[cell.buttonClick addTarget:self action:@selector(buttonPressedSoWhatNumber:)
forControlEvents:UIControlEventTouchUpInside];
cell.buttonClick.layer.masksToBounds = YES;
[cell addSubview:cell.buttonClick];
cell.layer.shouldRasterize = YES;
cell.layer.rasterizationScale = [UIScreen mainScreen].scale;
regular = cell;
} else if ([arLocks integerValue] == 1) {
TortoiseLocked *lockCell = (TortoiseLocked *)[collectionView dequeueReusableCellWithReuseIdentifier:tortIdentifier forIndexPath:indexPath];
[lockCell.tortoiseLock setTag:indexPath.row];
[lockCell.tortoiseLock setBackgroundImage:[UIImage imageNamed:@"TortoiseLock.png"]
forState:UIControlStateNormal];
lockCell.tortoiseLock.layer.masksToBounds = YES;
[lockCell addSubview:lockCell.tortoiseLock];
lockCell.layer.shouldRasterize = YES;
lockCell.layer.rasterizationScale = [UIScreen mainScreen].scale;
regular = lockCell;
}
return regular;
}
让我知道你的想法。我使用iOS 8.1和XCode 7.1.2
答案 0 :(得分:1)
如果数组中的值既不是0或1,那么cellForItemAtIndexPath
可以返回nil
。我怀疑这是发生了什么,然后集合视图断言失败,因为你有鉴于它而不是细胞。
简单的解决方法是将else if
更改为else
,这将导致"锁定"单元格默认为。
您还可以添加一个新的else
子句来记录错误,并使用它来尝试和诊断您没有获得0/1的原因。