cellForItemAtIndexPath:在 iOS7 中触发,但在 iOS6 中不触发

Posted

技术标签:

【中文标题】cellForItemAtIndexPath:在 iOS7 中触发,但在 iOS6 中不触发【英文标题】:cellForItemAtIndexPath: firing in iOS7 but not iOS6 【发布时间】:2014-01-15 18:18:11 【问题描述】:

最近添加带有自定义UICollectionViewFlowLayout 子类的UICollectionView 时,collectionView:cellForItemAtIndexPath: 方法ios7 上被调用,而不是在 iOS6 上调用。换句话说,在 iOS7 中一切正常,但我的自定义 collectionView 项目在 iOS6 中没有显示。有趣的是,单元格似乎在那里(collectionView 滚动),但所有项目都是空的,背景为白色。

collectionView在.xib文件中设置,dataSource和delegate附加,UICollectionViewDataSource和UICollectionViewDelegateFlowLayout在视图控制器.h文件中@interface调用后添加。

collectionView item size、section inset、行间距、item间距都是在自定义流布局init方法中设置的。

一些代码:

- (void)viewDidLoad

    [super viewDidLoad];

    self.collectionView.collectionViewLayout = [[TFSpringFlowLayout alloc] init];
    [self.collectionView registerClass:[TFWorkoutCell class] forCellWithReuseIdentifier:CellIdentifier];


-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section

    // This method is returning a value > 0
    return _workouts.count;


- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView

    return 1;


-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 

    // This is being called on iOS7, but is never being called on iOS6
    ...removed for clarity
    return cell;

编辑:问题已解决。我的自定义流布局包括一些使用新 UIDynamicAnimator 类的 iOS7 特定覆盖。这些不会导致崩溃,但会阻止在 iOS6 中绘制单元格。

【问题讨论】:

我猜你的布局有问题,所以看看TFSpringFlowLayout的内容和任何相关的委托方法会很有帮助。 【参考方案1】:

这就是我的问题,以防其他人将来遇到这个问题。

我的自定义 UICollectionViewFlowLayout 包含几个方法覆盖来实现 iOS7 的新 UIKit 动态。这些不会导致应用程序崩溃,但会阻止在 iOS6 中绘制单元格。

这是有问题的代码:

-(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect 
    return [self.dynamicAnimator itemsInRect:rect];


-(UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath 
    return [self.dynamicAnimator layoutAttributesForCellAtIndexPath:indexPath];

修复所需的简单更改:

-(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect 
    if ([UIDynamicAnimator class])
        return [self.dynamicAnimator itemsInRect:rect];
    else
        return [super layoutAttributesForElementsInRect:rect];


-(UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath 
    if ([UIDynamicAnimator class])
        return [self.dynamicAnimator layoutAttributesForCellAtIndexPath:indexPath];
    else
        return [super layoutAttributesForItemAtIndexPath:indexPath];

添加 if/else 语句来检查 iOS6 或 iOS7 并仅返回适当的响应为我解决了这个问题。希望这对其他人有帮助!

【讨论】:

你应该用修复更新这个答案,而不仅仅是问题。 仅供参考 - 这不是一个好的解决方案。检查类或方法的存在总是比检查操作系统版本更好。 @rmaddy 感谢提示,我已编辑答案以使用 [UIDynamicAnimator 类] 检查而不是操作系统

以上是关于cellForItemAtIndexPath:在 iOS7 中触发,但在 iOS6 中不触发的主要内容,如果未能解决你的问题,请参考以下文章

cellForItemAtIndexPath:在 iOS7 中触发,但在 iOS6 中不触发

集合视图:可以手动触发 cellForItemAtIndexPath 吗?

collectionView:cellForItemAtIndexPath: 永远不会被调用

使用 UICollectionViewFlowLayout / UICollectionViewLayout 子类,不会在正确的时间调用 CellForItemAtIndexPath

在 cellForItemAtIndexPath 中的 UICollectionViewCell 中更改 UIView 的框架

旋转时多次调用方法 collectionview(cellForItemAtIndexPath)