【问题标题】:Swift 3 Xcode 8 Collection View Reload Data with Segmented ControlSwift 3 Xcode 8 Collection View 使用分段控制重新加载数据
【发布时间】:2017-11-18 16:51:12
【问题描述】:

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

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

当我仔细观察闪烁的内容时,发现集合视图以随机顺序(或看起来如此)显示我的数组中的数据,然后快速(非常快!)切换回其“正确”顺序.

这是我的视图控制器:

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
}

【问题讨论】:

  • 您应该显示您的代码以获取更多详细信息。
  • 我会尝试在您的数据源方法中放置一个断点,以真正了解发生了什么。似乎您的数据中可能存在中间状态?
  • @AdamCampbell 是的,这是一个好主意,还通过放置一个“测试”按钮来试验 .reloadData() 的组合来解决这个问题,例如仅针对特定索引路径和部分等的组合。跨度>

标签: ios swift uicollectionview uisegmentedcontrol


【解决方案1】:

好的,所以我找到了解决此问题的方法。基本上之后:

collectionView.reloadData()

添加

collectionView.reloadItems(at: collectionView.indexPathsForVisibleItems)

为了避免在使用集合视图切换分段控件时可能遇到的令人讨厌且相当烦人的“闪烁”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-21
    相关资源
    最近更新 更多