セグメント化されたコントロールの選択インデックスに基づいて2つの異なる配列から2セットのデータを表示しています。すべて正常に動作し、すべての正しいデータがロードされます。しかし、非常に奇妙なことが起こります:Swift 3 Xcode 8 Collectionセグメンテーションコントロールによるリロードデータの表示
他のセグメント化されたコントロールのボタンを押すと、コレクションビューはかなりスムーズに切り替わります(セグメント化されたコントロールのIBActionでreloadData()が実装されています)。しかし、「正しいデータ」がロードされる前に非常に速く点滅します。私はXcodeを再起動しようとしましたが、テストする友人にもそれを与えました。すばやく「フラッシュ」が残っています。また、セグメント化されたコントロール 'button1'をセグメント化されたコントロール 'button 2'に戻すと発生します。
何が点滅しているかをよく見てみると、コレクションビューには、配列のデータがランダムな順序で表示される(または表示される)注文。ここで
は私のビューコントローラである:
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()の組み合わせを試すための 'テスト'ボタンを配置することで解決しました。 – MTsiang