2017-06-16 5 views
0

セグメント化されたコントロールの選択インデックスに基づいて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 
} 
+0

詳細については、コードを表示する必要があります。 –

+0

私は実際に何が起こっているかを見るためにデータソースメソッドにブレークポイントを置こうとします。あなたのデータに中間状態があるようですか? –

+0

@AdamCampbellはい、いいアイデアです。また、特定のインデックスパスやセクションなどのものと同じように.reloadData()の組み合わせを試すための 'テスト'ボタンを配置することで解決しました。 – MTsiang

答えて

0

[OK]をので、私はこれを回避する方法を発見しました。基本的には後:

は嫌とかなり迷惑な '点滅' を回避するためにあなたが得るかもしれません:

collectionView.reloadData()

は(collectionView.indexPathsForVisibleItemsで)

collectionView.reloadItemsを追加しますコレクションビューでセグメント化されたコントロールを切り替えます。

関連する問題