Swift 3 Xcode 8 Collection使用分段控制重新加载数据

时间:2017-06-16 03:24:42

标签: ios swift uicollectionview uisegmentedcontrol

我根据分段控件选择的索引显示来自2个不同阵列的2组数据。一切正常,所有正确的数据加载。然而,有一件事很奇怪:

当我按下另一个分段控件'按钮'时,集合视图应该非常流畅地切换(在分段控件IBAction中实现reloadData())。但是在加载“正确数据”之前它会很快闪烁。我已经尝试重新启动Xcode,甚至将它交给朋友测试,然而,快速'闪存'仍然存在。当我从分段控制'按钮2'返回分段控制'button1'时,也会发生这种情况。

当我仔细观察闪烁的情况时,事实证明集合视图以快速(非常快!)切换回其“正确”顺序之前以随机顺序(或看起来似乎是)显示来自我的数组的数据

这是我的视图控制器:

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

var array1 = ["Red", "Yellow", "Purple"]
var array2 = ["Apple", "Banana", "Grape"]

@IBAction func segmentedControl(_ sender: UISegmentedControl) {
    collectionView.reloadData()
    // Reload Data
    collectionView.reloadItems(at: collectionView.indexPathsForVisibleItems)
    // Prevents 'flash' from .reloadData()
}

@IBOutlet weak var segmentedOutlet: UISegmentedControl!
// Creates an outlet for segmented control (that can be set)

@IBOutlet weak var collectionView: UICollectionView!

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    switch segmentedOutlet.selectedSegmentIndex {
    case 0 : return array1.count
    case 1 : return array2.count
    default: return 0
    }
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! collectionViewCell

    switch segmentedOutlet.selectedSegmentIndex {
    case 0 : cell.button.setTitle(array1[indexPath.row], for: .normal)
    case 1 : cell.button.setTitle(array2[indexPath.row], for: .normal)
    default : break
    }
    return cell
}

1 个答案:

答案 0 :(得分:0)

好的,所以我找到了解决这个问题的方法。基本上是在:

之后

collectionView.reloadData()

添加

collectionView.reloadItems(at:collectionView.indexPathsForVisibleItems)

绕过使用集合视图切换分段控件时可能会遇到的令人讨厌且相当恼人的“闪烁”。