0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-12-14

#はじめに
今回はタップによって選択された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部品のインスタンスが存在しないためだと考えられます。
#参考したサイト
https://capibara1969.com/1060/
#まとめ
今回は画面遷移時の値の渡し方についてでしたが、自分が勉強した内容を随時更新していきます!
少しでも参考になった方はLGTMをお願いします!!

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?