2016-04-11 7 views
0

私はマスターコントローラに表示されたコレクションビューのセルを駆動するURLの文字列配列を持っています。IOS Swift Segueサポートするアレイではなく選択したCellのデータを使用

override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as! CollectionViewCell 

    loadImageInBackground(NSURL(string: self.fotosString[indexPath.row])!, target: cell.image!) 
    return cell 
} 

マイcollectionViewControllerが正しく、私は配列を持っているURLのすべての画像が表示されます。私のカスタムセルは、そのイメージプロパティ次のように関数呼び出しを経由して、バックグラウンドでロードされているUIImageViewを持っています。

DetailViewに移行すると、(画像がキャッシュ内にあるにもかかわらず)新しいURLの文字列に基づいて新しいダウンロードをトリガーするのではなく、セルにダウンロードされたデータを使用したい配列。だから私は、次のやっている:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "showImage" { 
     let dvc = segue.destinationViewController as! DetailViewController 
     let indexPaths = self.collectionView?.indexPathsForSelectedItems() 
     let indexPath = indexPaths![0] as NSIndexPath 
     let cell = self.collectionView!.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as! CollectionViewCell 
     dvc.currentImage = cell.image.image 
    } 
} 

しかし、cell.image.image戻りnilので、私のアプローチは機能していません。

私は次のように私の写真画像のためのクラスを設定することによって、より従来の方法でこれを行うことができます:

urlStr: String 
theImage: UIImage 

しかし、私はnilを取得していますなぜ私が疑問に思って、私がイメージにアクセスする方法データをセルから直接取得する。

+1

使用 'collectionViewを.cellForItemAtIndexPath( indexPath) 'の代わりに' dequeueReusableCellWithReuseIdentifier'を使用します。 – Caleb

+0

loadImageInBackgroundのコードを貼り付けることはできますか?問題を特定するのに役立つでしょう –

+0

[UICollectionViewでcell atIndexを取得する方法は?](http://stackoverflow.com/questions/30405726/how-to-get-cell-atindex-in-uicollectionview) -with-swift) – Caleb

答えて

2

あなたがしたい/やりたいことをするべきではありません。データモデルからイメージURLを渡して、それを使用する必要があります。

let cell = self.collectionView!.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as! CollectionViewCell 

はあなたが持っている必要があります:

あなたの問題は、セルを再利用する/作成するのではなく実行して、現在の1発見しているということです!

let cell = self.collectionView!. cellForItemAtIndexPath(indexPath) as! CollectionViewCell 
+0

正しい方法を指摘してくれてありがとう。しかし、私はなぜこのようにしてはならないのか分かりません。 (私は過去の講師を含む他の人たちに聞いたことがあるが、誰もこのアプローチに関連する問題を実際に説明することはできなかったと私は感じていた。「それは理由だよ」 – gone

+0

データモデルはデータを保持し、ビューはデータを表示するので、誰かからデータを取得する必要があるときは、ビューではなくデータモデルです。間違った方法で問題を起こすのは難しく、うまくいくかもしれませんが、最終的にUIで何かを変更したいと思ったところで、全体の流れを壊したり、実際にビューで使用されていないときにデータをビューに保存したりして、後でそれを再度照会することができます。 – Wain

+0

実際のデータはURLですが、イメージ自体はコントローラによって取得され、したがって派生データです。 MVCパターンでは、モデルのデータをビューに送信する準備として、コントローラがモデルのデータに対して操作を実行できませんか? – gone

関連する問題