筆者の状況
まず英語の単語帳アプリを作成していて、DBはRealmを使用しております。
そこでビューコントローラー間の値の受け渡しにはまったので共有します。
したかったこと
単語を追加して
登録した単語がセルに追加される
登録した単語のセルをタップしたら
そのセルの詳細が見れる
セルをタップしてそのセルの番号を取得←
これがむずかった!
git
ソースコードは以下にあります。
まだ作成途中なので日々更新されるかもです。
流れ
流れはこんな感じになっております。
ソースの説明をしていきます
※細かい全てのソースの説明は致しませんのでご了承ください。
まずセルの番号を記憶しておく変数を作成します。
var indexNum = 0
これはviewDidLoadの外辺りに書いておきます。
次にセルをタップしたときに走るコードは
didSelectRowAt
になるので
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
indexNum = indexPath.row
performSegue(withIdentifier: "toNextViewController", sender: nil)
}
と書きます。
indexPathでタップしたセルの番号が分かりますので
indexNum = indexPath.row
でとりあえず作成しておいた変数にタップした時のセルの番号を代入します。
しかしタップした時のセルの番号を変数に代入しただけなので次のビューに値を受け渡すことができません。
なのでprepare for segueをoverrideをします。
override func prepare(for segue: UIStoryboardSegue, sender: Any!) {
if (segue.identifier == "toNextViewController") {
let nextVC: NextViewController = (segue.destination as? NextViewController)!
nextVC.num = indexNum
}
}
ここでは次のビューコントローラーに値を渡すことができます。
let nextVC: NextViewController = (segue.destination as? NextViewController)!
変数に次のビューコントローラーのセグエを代入します。
nextVC.num = indexNum
で次のビューコントローラーのnumという変数にindexNumを代入しました。
しかしこのままでは動きません。
次のビューコントローラー、今回の場合はNextViewControllerにnumという変数を用意しておきます。
var num = Int()
するとセルをタップしたときにnumという変数の中にindexPathで取得したセルの番号が入っているはずです。
うまくわからないので
print(num)
してもらえばうまく値を受け渡せているのがわかるかと思います。
まとめ
単なる値の受け渡しにかなり手こずりましたが一度経験してしまえば次からはすぐなのでうまく対処することができて良いですね。
だいぶswiftのことわかってきたので一気にSNSとか作ってみます。