2016-12-12 11 views
0

collectionViewセルのデータを別のView Controllerに渡したいとします。私はこれまでに来ましたが、私は立ち往生しています。基本的には、私のcollectionViewセル内のラベルのテキストを別のView Controllerのラベルに渡したいと思います。以下のコードは動作しません。私は、どのセルがタップされたかを示すコードを追加する必要があると思います。私はこのviewController.dataLabelObject = "Hello"にこのラインviewController.dataLabelObject = valueToPassを変更したときにところで、私はあなたはそれが間違って完了です他のコントローラcollectionViewセルのindexPathを取得する

var valueToPass: String! 

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    { 
     if segue.identifier == "mySegue" 
     { 
      let viewController = segue.destination as! AnimalsViewController1 
      viewController.dataLabelObject = valueToPass 
     } 
    } 

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) 
    { 
     let currentCell = myCollectionView.cellForItem(at: indexPath) as! CollectionViewCell1 
     valueToPass = currentCell.textLabel.text 


     performSegue(withIdentifier: "mySegue", sender: self) 
    } 
+1

あなたが問題を解決しようとしている方法は根本的に間違っています。ビューはデータを運ぶためのものではなく、モデルの仕事です。それは、最初にラベル値を提供したモデルをつかんで、その値を渡すことができると言われています。 – Alladinian

答えて

0

あなたは思考を調整する必要があります。セルはデータを格納せず、データを提示し、ユーザーからの入力を収集します。

ユーザーがタップしたセルからデータを抽出しようとするのではなく、選択したセルのインデックスパスを取得し、配列内のデータを検索します。

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) 
{ 
    valueToPass = myArray[indexPath.row] 
    print("In \(#function), valueToPass = \(valueToPass)") 
    performSegue(withIdentifier: "mySegue", sender: self) 
} 

そして先ビュー・コントローラにそのデータを渡します:また、何が起こっているのかを把握するために道に沿ってprint文を追加

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
{ 
    if segue.identifier == "mySegue" 
    { 
     let viewController = segue.destination as! AnimalsViewController1 
     print("In \(#function), valueToPass = \(valueToPass)") 
     viewController.dataLabelObject = valueToPass 
    } 
} 

は、ログインするために先ビュー・コントローラにprint文を追加します。ロード時のdataLabelObjectの値

+0

私はそれをしました。私のアプリを走らせたとき、私はコンソールでこれを取得しました。準備中(:送信者:)、valueToPass = nil collectionView(_:didSelectItemAt :)で、valueToPass = Optional( "cat") 準備中:)、valueToPass = Optional( "cat") 'valueToPassは最初のものではnilですが、最後の値には値があります。 2番目のビューコントローラには表示されません –

+0

セグを2回呼び出すように聞こえます。 「didSelectItemAt」で呼び出すだけでなく、セルに直接リンクされたセグを持っていますか? –

+0

なぜ賛成投票ですか?私の答えが何となく欠けていると思うなら、どうか教えてください。 –

-1

上でそれを見ることができます。まず、あなたがあなたのコントローラ内の文字列を格納する場合、それは良くなる、ラベルからデータを渡すべきではありませんすべての:

var strings: [Strings]! 

その後、あなたはセルを選択する際、senderとしてindexPathを渡す:では

performSegue(withIdentifier: "mySegue", sender: indexPath) 

をセグの準備:

let indexPath = segue.sender as! IndexPath 
let string = strings[indexPath.item] 
viewController.dataLabelObject = string 
+0

これは可能ですが、標準的な方法ではありません。私はこれが**この問題を解決するための**方法であることを意味する答えを書いていません。 –

+0

@DuncanC ofc、それは間違っていて、詳細を回答に追加したかったのです。 –

+0

私は '' prepare(for::sender:) 'メソッドにパラメータを渡すために' performSegue(withIdentifier:sender:) 'の呼び出しでsenderパラメータを使用することが1つのオプションであることを示唆しています。しかしそれは働く。 –

関連する問題