2017-01-20 15 views
0

Swift 3のコレクションビューに問題があります。Stackoverflowでいくつかのヒントを見つけて試してみましたが、無駄なことはありません。多くの人が 'prepareReuse'メソッドを使うと言いましたが、自分のコードでそれらを動作させることができませんでした。下にスクロールしてからもう一度バックアップした後、画像が変更されました。すべての画像はアルファベットの文字です。したがって、A、B、Cはビューの上部に表示される最初の画像です。下にスクロールしてバックアップすると、ランダムな他の文字が置かれています。私はこの問題を解決するために、コードのいくつかの小さなビットをしないのです願っていますcollectionViewでスクロールした後に間違った画像が読み込まれました3

import UIKit 

class colViewController2: UIViewController, UICollectionViewDelegateFlowLayout, UICollectionViewDataSource { 

var imageData: [String] = [String]() 
var imageCounter: Int = 0 
var userHasHieroglyph: NSArray = ["","","C","D","E","F","G","H","I","J","K","L","M","N","O","","Q","R","S","T","U","V","W","X","Y","Z"] 

override func viewDidLoad() { 
    super.viewDidLoad() 

    imageData = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"] 
    for b in imageData { 
     if userHasHieroglyph.contains(b) { 
      let newHieroglyph = b.lowercased() 
      imageData[imageData.index(of: b)!] = "h-"+newHieroglyph 
     } 
    } 
} 

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

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellid", for: indexPath) as! MyImageCell 
    cell.backgroundColor = UIColor.white 
    var currImage:String = "" 
    currImage = self.imageData[self.imageCounter] 
    self.imageCounter += 1 

    if self.imageCounter >= self.imageData.count { 
     self.imageCounter = 0 
    } 

    cell.image.image = UIImage(named: currImage) 
    return cell 
} 

func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { 
    return 1 
} 

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
    return 26 
} 

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 
     return CGSize(width: 90, height: 90) 
} 
} 

が、多くのStackOverflowの上で検索する時間、およびインターネットの後、私はまだ解決策を見つけることができません。次のように私の全体のコードがありますこの問題。誰かが解決策やヒントを持っていれば、それは非常に感謝しています!

挨拶

+0

にメモを行うことができます:あなたは 'userHasHieroglyphを使用する理由:numberOfItemsInSection'あなたは' self.imageData.count' – muescha

+0

ノートを返す必要があります 'に:NSArray'だけでなく、 '[String]' – muescha

+0

注:これは常にあなたのコード内では白であるので、 'cell.backgroundColor = UIColor.white'をMyImageCellのinitに入れてください。 – muescha

答えて

0

問題は、あなたがイメージのあなたの配列のインデックスとしてimageCounter使用して、それをインクリメントの代わりindexPath.itemを使用していることです。 UICollectionViewはUICollectionViewCellインスタンスを再利用することに注意してください。基本的には、画面に表示されているインスタンスのセルインスタンスのみを作成します。セルが画面からスクロールして新しいものが取り出された場合(たとえば、「A」、「B」、および「C」が画面上にあり、「B」、「C」、 D "の場合、UICollectionViewは" A "セルを" D "に再利用しますが、これは少し単純化されていますが、動作の仕方は多少あります)。このように、cellForItemコールは、indexPathパラメータに表示されているセルに関する情報を提供します。この場合、あなたはself.imageCounterロジックのすべてを取り除く、代わりにcell.image.image = UIImage(named: imageData[indexPath.row])

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellid", for: indexPath) as! MyImageCell 
    cell.backgroundColor = UIColor.white 
    cell.image.image = UIImage(named: imageData[indexPath.row]) 
    return cell 
} 
+0

説明に感謝します!それは今働いている!これは処理時間を最小限に抑えるために行われたのですか、それとも最初にこのように動作するのか、あなたが知っている別の理由がありますか? しかし、言ったように、ありがとう! – Jelleko

+0

私はそれがオブジェクト作成の数を減らすことだと思います。時間とメモリ消費の両方の可能性があります。 UICollectionViewCell(またはUITableViewCell)をデータ配列内のすべての要素に対して作成する理由はないでしょう。また、この回答に満足している場合は、それを受け入れたものとしてマークしてください。ありがとう。 – SuperDuperTango

関連する問題