UICollectionView *Assertion Failure* 未在 UICollectionViewCell 上应用属性

UICollectionView *Assertion Failure* for not applying attributes on UICollectionViewCell

我正在尝试执行以下操作:

A)关卡 1 已解锁(包含已解锁关卡的背景图片)。

B) 2-20 级已锁定(包含另一张背景图片)。当每个连续的级别完成时,它们将被解锁。

最初,当我 运行 应用程序并转到我的 UICollectionView 时,一切看起来都很好。当我玩第 1 级并完成它时,我(通过核心数据)为一个名为 levelLockedNSNumber 管理对象保存数字 0,现在属于第 2 级(0 表示解锁,其他级别3-20 应该用 1).

锁定

保存关卡是锁定还是解锁的过程有效。但是当我 return 到我的 UICollectionView 时,我没有看到 2 级的物理变化(它仍然有锁的背景图像)。

此外,如果我在UICollectionView之前return到ViewController,然后重新输入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,则您的 cellForItemAtIndexPath 可以 return nil。我怀疑这是正在发生的事情,然后集合视图有一个断言失败,因为你给它 nil 而不是一个单元格。

简单的解决方法是将 else if 更改为 else,这将导致默认情况下出现 "locked" 单元格。

您还可以添加一个新的 else 子句来记录错误并使用它来尝试诊断您没有得到 0/1 的原因。