gpt4 book ai didi

ios7 - UICollectionView _createPreparedCellForItem 断言失败

转载 作者:行者123 更新时间:2023-12-02 01:49:48 32 4
gpt4 key购买 nike

编辑:对于遇到此问题的任何人,我已经用适合我的解决方案回答了我的问题,您可以在下面找到。

原始问题

我正在尝试使用两种类型的单元格构建一个两列、多部分的 UICollectionView。我的目标有两种基本状态(每个部分):

  • 至少有一项要显示
    • 至少显示一个代表项目的单元格,其中每个单元格的宽度是整个 CollectionView 的一半
  • 没有要显示的项目
    • 显示一个表示空白状态的特殊单元格,其宽度是普通单元格的两倍(因此它占据了该“行”的 CollectionView 的整个宽度)

我已经为此构建了我认为正确的设置,包括重写下面的 CollectionViewDelegateFlowLayout 方法:

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
return [self trueSectionCount:indexPath.section] > 0 ? CGSizeMake(kItemCellWidth, kItemCellHeight) : CGSizeMake(kItemCellEmptyWidth, kItemCellEmptyHeight);
}

它返回一个合适的大小,匹配一些维度,这些维度与两种状态的单元格相同。


我的问题如下:cellForItemAtIndexPath: 方法中创建第一个单元格并随后返回后,抛出断言失败,如下所示:

*** Assertion failure in -[UICollectionView _createPreparedCellForItemAtIndexPath:withLayoutAttributes:applyAttributes:], /SourceCache/UIKit_Sim/UIKit-2935.137/UICollectionView.m:1289

看完some/other/questions关于类似的话题,我有一些理论。

我以前认为这与我使用两种不同尺寸的事实有关,但这是不对的,因为我手动覆盖了上面显示的所需方法,而且我从不设置我的 UICollectionViewFlowLayout 对象的 itemSize 属性。

我的另一个理论是,这可能是由在使用 UICollectionView 注册我的 Nibs/Classes 时一些有趣的事情引起的。由于我有两个类可以在任何给定时间用于项目填充,并且根据我从 UICollectionView.h 中的注释收集的内容,特别是 102-104 行,应该只有一个与 View 关联的注册类/ Nib 。所以我注释掉了 nib 的注册,而不是在 cellForItemAtIndexPath 中调用 dequeueReusableCellWithReuseIdentifier:,我只是将一个新的 Cell 初始化为 nil,然后让我的逻辑创建新的 cell从它适当的 Nib ,而不是允许 CollectionView 使用它自己的内部逻辑尝试和出队或生成一个新的单元格(我知道 Apple 最近实现的区分 UICollectionView 来自 UITableView 在这方面)。不幸的是,我仍然遇到这个断言失败。

我已经没有想法了,我很想知道是否有人可以帮助我解决这个问题。如果有任何我可能遗漏的更多信息,请告诉我,我很乐意提供。

最佳答案

原始问题的解决方案

我已经弄清楚问题出在哪里了。

基本上我的理论是正确的,问题是由于注册了要被 CollectionView 出列的 Nib。我正在做的是注册两个不同的UICollectionView 子类以供重复使用,这很好,除了我使用相同 恢复标识符两者都有,所以 CollectionView 不知道要出列哪一个。我更改了我的代码以这样注册它们:

[self.collectionView registerNib:[UINib nibWithNibName:@"SomeItemCell" bundle:nil] forCellWithReuseIdentifier:CellIdentifier];
[self.collectionView registerNib:[UINib nibWithNibName:@"SomeEmptyItemCell" bundle:nil] forCellWithReuseIdentifier:EmptyCellIdentifier];

然后随后使用它们自己的标识符适本地使单元格出队:

if (there are items to show in this section)
{
SomeItemCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];
... code ...
return cell;
}
else
{
SomeEmptyItemCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:EmptyCellIdentifier forIndexPath:indexPath];
... code ...
return cell;
}

这确保了 CollectionView 确切地知道要使用哪个单元格。我在上面显示的调整大小的方法也是正确的,如果您计划使用多个单元格,那么该方法非常重要,可以让所有内容很好地协同工作。

关于ios7 - UICollectionView _createPreparedCellForItem 断言失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23526633/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com