自定义CollectionView单元格'尝试更新单元格时,布局元素消失

时间:2016-06-02 20:18:25

标签: ios swift

我有一个用于集合视图的自定义单元格,它在故事板中设置并且具有连接到相应单元类的出口。

class MyCustomCollectionViewCell: UICollectionViewCell {

    // MARK: Outlets

    @IBOutlet weak var customImage: UIImageView!
    @IBOutlet weak var customProgress: UIProgressView!
    @IBOutlet weak var customLabel: UILabel!

}

初始设置工作正常,我根据数据库中某个项目的特定状态设置自定义图像,名称和进度。

我想更新集合视图以反映更改,尤其是有关状态栏的更改。此外,状态栏完成后,图像也应该更改。

timer = NSTimer.scheduledTimerWithTimeInterval(3, target: self, selector: #selector(MyViewController.updateUI), userInfo: self, repeats: true)

在视图出现时使用计时器启动,我想每隔几秒更新一次视图(我选择3来有效地测试它,但它也可能长达20秒)。

问题是,我不知道在这里使用什么方法,因为它们都有特定的缺点:

  • reloadSections(mySection)reloadData()会导致所有单元格略微闪烁(这没关系),但会导致所有进度条在第一次更新后完全消失。
  • setNeedsLayout()setNeedsDisplay()似乎根本没有效果。什么都没有(可见)发生。

所有方法都在self.collectionView上调用,如下所示:

@objc private func updateUI() {
    // self.collectionView?.reloadSections(singleSection) 
    // self.collectionView?.reloadData() 
    // self.collectionView?.setNeedsLayout() 
    // self.collectionView?.setNeedsDisplay() 
}

(我一个接一个地尝试了它们)

如果没有进度条消失,我如何(自动)更新我的视图?

2 个答案:

答案 0 :(得分:1)

我认为您可以使用在另一个线程中运行的dispatch_async。

collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath)中放置一个标记,如果为true则仅更改图像。

在单元格中,使用

开始循环进度
dispatch_async(dispatch_get_main_queue(), {
    //do staff to controle your progress state
    // set your flag to true if progress is ok 
    // if ok then reload the collection  
   CollectionView.reloadData()}

现在标志为true,更新您的图片。 没试过,但我认为这可能是一种可能的方式。

答案 1 :(得分:0)

在我为单独队列中的单元格实现自动更新后(建议user2718075),我仍然遇到了视图消失的问题。当我滚动并查看我通过customProgress.hidden = true隐藏进度条的其他单元格时,每次带有进度条的视图都会从视线中消失时会发生这种情况,因为它们已完成。

这让我意识到这个问题与细胞重用有关。具有进度条的单元格将用于没有进度条的另一个单元格,因此它被隐藏。在为需要进度条的单元格再次出列并重新使用之后,我没有调用customProgress.hidden = false。将该行添加到单元格配置后,问题就消失了。