滚动后UICollectionView显示错误的单元格 - 出列问题?

时间:2012-10-31 17:47:50

标签: pdf uicollectionview uicollectionviewcell

我在UIViewController中有一个UICollectionView。在collectionView cellForItemAtIndexPath:方法中,它基于数据源创建一系列自定义单元格。自定义单元格又包含一个UIView,子类用于绘制单个PDF页面。

它的设置方式是将PDF文件拆分为单页,因此单元格1包含PDF页面1,单元格2包含PDF页面2,依此类推。到目前为止一切顺利,这是我的问题:

当我向下滚动时,UICollectionView开始显示错误的单元格。例如,在34页的文档中,它以正确的顺序显示单元格/页面1-16,但随后开始显示似乎已经进一步出列的页面,例如单元格1,单元格2,细胞4.我从未到过细胞/第34页附近的任何地方。

我在过去看过UITableView的类似行为,并认为它与单元格的出列或委托方法有关。不太确定 - 任何帮助表示赞赏。

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

//create custom cell
CustomCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cellID" forIndexPath:indexPath];

//set file name (always the same; one PDF file)
cell.fileName = fileName;
cell.backgroundColor = [UIColor clearColor];

//set the title to the page number
cell.title = [NSString stringWithFormat:@"page %@", [countArray objectAtIndex:indexPath.row]];

//set the current page (which indicates which page to display) according to the pageCount
cell.currentPage = [[countArray objectAtIndex:indexPath.row] intValue];

return cell; }

3 个答案:

答案 0 :(得分:14)

我有类似的问题。这很可能是因为重用的单元格不会重绘。在自定义单元格的内容类(PDF视图)中,如果框架已更新,则触发重绘:

-(void)setFrame:(CGRect)frame {
    [super setFrame:frame];
    [self setNeedsDisplay]; // force drawRect:
}

这对我有用。此外,如果您的单元格大小可能会更改,请设置自动调整遮罩,以便使用

填充空格
self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

在初始化期间。

答案 1 :(得分:13)

修复了使用prepareForReuse方法的类似问题

只需将此方法添加到自定义单元格实现

即可
- (void)prepareForReuse {

     self.fileName = nil;
     self.title = nil;

     // add remaining properties 

}

答案 2 :(得分:1)

我根据Asatur Galstyan的回答在swift中解决了类似的问题。

将自定义类与故事板中的单元格相关联后,可以覆盖prepareForReuse()函数:

import UIKit

class SomeCollectionViewCell: UICollectionViewCell {

    @IBOutlet weak var exampleView: UIView!
    @IBOutlet weak var exampleLabel: UILabel!

    override func prepareForReuse(){
        super.prepareForReuse()
        exampleLabel.textColor = nil
        exampleView.backgroundColor = nil
        exampleView.layer.cornerRadius = 0
    }
}

prepareForReuse()的默认实现不执行任何操作(至少在iOS 10中),但Apple recommends calling the the super.prepareForReuse() when overriding anyway