UICollectionView * Assertion Failure *表示不在UICollectionViewCell上应用属性

时间:2016-10-16 21:07:44

标签: ios uicollectionview uicollectionviewcell nib

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

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

1 个答案:

答案 0 :(得分:1)

如果数组中的值既不是0或1,那么cellForItemAtIndexPath可以返回nil。我怀疑这是发生了什么,然后集合视图断言失败,因为你有鉴于它而不是细胞。

简单的解决方法是将else if更改为else,这将导致"锁定"单元格默认为。

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