swift3で、tableviewのセルのindex番号で複数の画面に遷移先を振り分け、値を渡したい。
###発生している問題・エラーメッセージ
画面遷移時に値が渡せずエラーがでてしまいます。
エラーメッセージ
fatal error: unexpectedly found nil while unwrapping an Optional value
###該当のソースコード
swift3
1import UIKit 2 3//セルに表示するデータ 4let sectionTitle = ["4月"] 5let section0 = [("1week","1day"),("","2day"),("","3day"),("","4day"),("","5day"), 6 ("2week","6day"),("","7day"),("","8day"),("","9day"),("","10day"), 7 ("3week","11day"),("","12day"),("","33day"),("","14day"),("","15day"), 8 ("4week","16day"),("","17day"),("","18day"),("","19day"),("","20day"),] 9 10class TableViewController: UITableViewController { 11 12 var result:Int? 13 14 // MARK: - Table view data source 15 16 //セクションの個数 17 override func numberOfSections(in tableView: UITableView) -> Int { 18 return sectionTitle.count 19 } 20 21 //セクション内の行数 22 override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 23 return section0.count 24 } 25 26 //セクションのタイトルを決める 27 override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 28 return sectionTitle[section] 29 } 30 31 //セルを作る 32 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 33 let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) 34 let cellData = section0[(indexPath as NSIndexPath).row] 35 cell.textLabel?.text = cellData.0 36 cell.detailTextLabel?.text = cellData.1 37 cell.tag = indexPath.row //※rowを保存 38 return cell 39 } 40 41 42 //セルがタップされた時の処理 43 override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){ 44 tableView.deselectRow(at: indexPath, animated: false) 45 print("タップされたセルのindex番号: (indexPath.row)") 46 result = indexPath.row 47 if result == 0 { 48 performSegue(withIdentifier: "segue1",sender: self) 49 }else if result == 1 { 50 performSegue(withIdentifier: "segue2",sender: self) 51 }else if result == 2 { 52 performSegue(withIdentifier: "segue3",sender: self) 53 } 54 } 55 56 57 //セグエで移動する前にデータを受け渡す 58 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 59 //セグエがsegue1のときの処理 60 if segue.identifier == "segue1" { 61 //セグエsegue1のとき実行する 62 if let indexPath = self.tableView.indexPathForSelectedRow { 63 //行のデータを取り出す 64 let cellData = section0[indexPath.row] 65 result = Int(indexPath.row) 66 //移動先のビューコントローラのdataプロパティに値を設定する 67 if let navi = segue.destination as? UINavigationController, 68 let fVC = navi.viewControllers.first as? ViewController { 69 fVC.data = cellData.1 70 fVC.received = result 71 } 72 } 73 print("prepare(result)") 74 } 75 //セグエがsegue2のときの処理 76 if segue.identifier == "segue2" { 77 //セグエsegue2のとき実行する 78 if let indexPath = self.tableView.indexPathForSelectedRow { 79 //行のデータを取り出す 80 let cellData = section0[indexPath.row] 81 result = Int(indexPath.row) 82 //移動先のビューコントローラのdataプロパティに値を設定する 83 if let navi = segue.destination as? UINavigationController, 84 let sVC = navi.viewControllers.first as? SecondViewController { 85 sVC.data = cellData.1 86 sVC.received = result 87 } 88 } 89 print("prepare(result)") 90 } 91 //セグエがsegue3のときの処理 92 if segue.identifier == "segue3" { 93 //セグエsegue3のとき実行する 94 if let indexPath = self.tableView.indexPathForSelectedRow { 95 //行のデータを取り出す 96 let cellData = section0[indexPath.row] 97 result = Int(indexPath.row) 98 //移動先のビューコントローラのdataプロパティに値を設定する 99 if let navi = segue.destination as? UINavigationController, 100 let tVC = navi.viewControllers.first as? ThirdViewController { 101 tVC.data = cellData.1 102 tVC.received = result 103 } 104 } 105 print("prepare(result)") 106 } 107 } 108 109 110 override func viewDidLoad() { 111 super.viewDidLoad() 112 113 } 114 115 override func didReceiveMemoryWarning() { 116 super.didReceiveMemoryWarning() 117 } 118} 119
###該当のソースコード
swift3
1import UIKit 2 3class ViewController: UIViewController { 4 5 @IBOutlet weak var myLabel: UILabel! 6 @IBOutlet weak var indexLabel: UILabel! 7 8 9 //シーン移動の際に設定されるデータ 10 var data:String? 11 var received:Int? 12 13 14 15 override func viewDidLoad() { 16 super.viewDidLoad() 17 18 //おためしラベル 19 myLabel.text = data 20 indexLabel.text = String(received!) 21 } 22 23 24 override func didReceiveMemoryWarning() { 25 super.didReceiveMemoryWarning() 26 // Dispose of any resources that can be recreated. 27 } 28}
###試したこと
上記のコードでViewControllerの方のindexLabel.text = String(received!)で[EXC_BAD_INSTRUCTION]とエラーがでてデバックエリアには[fatal error: unexpectedly found nil while unwrapping an Optional value]とでます。
myLabel.text = data のところは何も表示されません。
indexLabelのコードを消してRunするとエラーも出ず画面遷移はできるのですが、myLabelの表示がありません。prepare~のところが機能していないのでしょうか?
初心者なので汚いコードで申し訳ないですが、宜しくお願いします。
###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報
tableviewはNavigationControllerの部品を使って既成しています。
回答1件
あなたの回答
tips
プレビュー