UICollectionView *Assertion Failure* 未在 UICollectionViewCell 上应用属性
UICollectionView *Assertion Failure* for not applying attributes on UICollectionViewCell
我正在尝试执行以下操作:
A)关卡 1 已解锁(包含已解锁关卡的背景图片)。
B) 2-20 级已锁定(包含另一张背景图片)。当每个连续的级别完成时,它们将被解锁。
最初,当我 运行 应用程序并转到我的 UICollectionView
时,一切看起来都很好。当我玩第 1 级并完成它时,我(通过核心数据)为一个名为 levelLocked
的 NSNumber
管理对象保存数字 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 的原因。
我正在尝试执行以下操作:
A)关卡 1 已解锁(包含已解锁关卡的背景图片)。
B) 2-20 级已锁定(包含另一张背景图片)。当每个连续的级别完成时,它们将被解锁。
最初,当我 运行 应用程序并转到我的 UICollectionView
时,一切看起来都很好。当我玩第 1 级并完成它时,我(通过核心数据)为一个名为 levelLocked
的 NSNumber
管理对象保存数字 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 的原因。