我有一个用于集合视图的自定义单元格,它在故事板中设置并且具有连接到相应单元类的出口。
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()
}
(我一个接一个地尝试了它们)
如果没有进度条消失,我如何(自动)更新我的视图?
答案 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
。将该行添加到单元格配置后,问题就消失了。