[Swift] 選択されたcollectionViewCell内のLabel値を遷移先のTextFieldに渡す方法


はじめに

今回はタップによって選択されたcollectionViewCell内のLabel値をsegueを使った遷移での遷移先のTextFieldに渡す方法を記録しておきたいと思います。ちなみにNavigationControllerとsegueを用いて画面遷移をしています。

開発環境

macOS 11.0.1
Xcode version 12.2
Swift version 5.3.1

実装したいこと

前提として

まず、値を渡すコードを書く前の段階で下のような状態で、5個のcellのそれぞれラベルに[あ][い][あ][え][お]が順番通りに代入されています。
これに[あ]のcellを押したら[あ]が、[い]のcellを押したら[い]というふうに選択したcellの内容を遷移先に渡すコードを書きたいと思います。

FirstViewContoroller
import UIKit

class ViewController: UIViewController,UICollectionViewDelegate,UICollectionViewDataSource{

    @IBOutlet weak var collectionView: UICollectionView!

    var array = ["あ","い","う","え","お"] //今回の配列の数は5個

    override func viewDidLoad() {
        super.viewDidLoad() 
    }

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

         return array.count //cell数を配列の数に設定

    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for:indexPath)
        //タグ付けされたCell内のLabelにarrayのString値を入れる
        var arrayLabel = cell.contentView.viewWithTag(1) as! UILabel
        arrayLabel.text = array[indexPath.row] 

        return cell
    }
}

遷移元のControllerには下のコードを書き加える

FirstViewController
    //選択されたラベル値を受け取る
    var selectedArray:String?

    //didSelectItemAtでcellを選択した時の挙動を書く
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

        //選択したCell内のラベルがselectedArrayに代入される
        selectedArray = array[indexPath.row]
        //画面遷移
        performSegue(withIdentifier: "toNext", sender: nil)

    }

    //segueの準備
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        let nextVC = segue.destination as? NextViewController
        //遷移元のselectedArrayを遷移先のselectedLabelに渡す
        nextVC?.selectedLabel = selectedArray

    }

遷移先のNextViewControllerに書くこと

NextViewController
import UIKit


class NextViewController: UIViewController {

    @IBOutlet weak var textFiled: UITextField! 
    //遷移元で選択された値が入ってくる 
    var selectedLabel:String?

    override func viewDidLoad() {
        super.viewDidLoad()
        //渡ってきた値をTextFiledに渡す
        textFiled.text = selectedLabel

    }

このように書くことで、選択したcell内のラベル値を遷移先に渡す事ができます。

よくある間違い

 NextViewControllerでは、インスタンス変数としてvar selectedLabel:String?を設定し、そこに遷移元の値を渡してします。しかし、そんなことせず直接textFiledに値を渡せばいいと思う方もいるかもしれません。僕もそうでした。
 このやり方は間違いとなっています。実際に書いてビルドしてセルを選択してみるとUnexpectedly found nil while implicitly unwrapping an Optional valueというエラーでてきます。簡単に言うと予期せぬnilがあるよ!という意味です。nilとは簡単に言うと空っぽという意味です。
 この原因はおそらく遷移元の取得した値を遷移先のtextFiledに渡そうとする時に、遷移先のUITextFiled部品のインスタンスが存在しないためだと考えられます。

参考したサイト

まとめ

今回は画面遷移時の値の渡し方についてでしたが、自分が勉強した内容を随時更新していきます!
少しでも参考になった方はLGTMをお願いします!!