#はじめに
今回はタップによって選択されたcollectionViewCell内のLabel値をsegueを使った遷移での遷移先のTextFieldに渡す方法を記録しておきたいと思います。ちなみにNavigationControllerとsegueを用いて画面遷移をしています。
#開発環境
macOS 11.0.1
Xcode version 12.2
Swift version 5.3.1
#実装したいこと
###前提として
まず、値を渡すコードを書く前の段階で下のような状態で、5個のcellのそれぞれラベルに[あ][い][あ][え][お]が順番通りに代入されています。
これに[あ]のcellを押したら[あ]が、[い]のcellを押したら[い]というふうに選択したcellの内容を遷移先に渡すコードを書きたいと思います。
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には下のコードを書き加える
//選択されたラベル値を受け取る
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に書くこと
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をお願いします!!