Swift初心者です。
質問の仕方に至らぬ点があるかもしれませんが、どうぞよろしくお願いいたします。
前提・実現したいこと
予定詳細画面(↓PlanDetailsViewController)のLabelに表示されている日時(2020年7月15日 水曜日 15:00)を、
右上の鉛筆アイコンをクリックして編集画面(↓AddPlanViewController)に遷移した際、
日時セル(DateAndTimeCell)のTextFieldに最初から表示したいです。
ちなみに、予定詳細画面のLabelに表示されている日時は、
ホーム画面(↓HomeViewController)のTableViewのLabelから以下のコードで渡しています。
#####HomeViewController.swift
ホーム画面
Swift
1import UIKit 2 3class HomeViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 4 5 @IBOutlet weak var PlanTable: UITableView! 6 var DateAndTimes = [String]() 7 8 /* 9 10 省略 11 DateAndTimesに文字列をセットする処理 12 13 */ 14 15 override func viewDidLoad() { 16 super.viewDidLoad() 17 18 /* 19 20 省略 21 22 */ 23 } 24 25 override func didReceiveMemoryWarning() { 26 super.didReceiveMemoryWarning() 27 } 28 29 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 30 31 let cell = tableView.dequeueReusableCell(withIdentifier: "PlanCell", for: indexPath) 32 33 let DateAndTimeLabel = cell.viewWithTag(1) as! UILabel 34 DateAndTimeLabel.text = self.DateAndTimes[indexPath.row] 35 36 return cell 37 } 38 39 /* 40 41 省略 42 TableViewのその他の処理 43 44 */ 45 46 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 47 48 guard let identifier = segue.identifier else { 49 return 50 } 51 if identifier == "toPlanDetails" { 52 let PlanDetailsVC = segue.destination as! PlanDetailsViewController 53 PlanDetailsVC.DateAndTime = self.DateAndTimes[(self.PlanTable.indexPathForSelectedRow?.row)!] 54 } 55 56}
発生している問題・エラーメッセージ
Buildできますが、
予定詳細画面の右上の鉛筆アイコンをクリックして編集画面に遷移しようとすると
以下のエラーメッセージが出て先に進めません。
Thread 1: Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value
エラーの位置は予定詳細画面(PlanDetailsController.swift)のprepare内、
オプショナルバインディングの行です。
if identifier == "editPlan" { let addPlanVC = segue.destination as! AddPlanViewController addPlanVC.PlanTitle = self.PlanTitle let indexPath = IndexPath(row: 0, section: 0) if let cell = addPlanVC.addPlanTable.cellForRow(at: indexPath) as? DateAndTimeCell { // ここにエラー cell.DateAndTime = self.DateAndTime } else { print("nil") } }
書籍やドットインストールを参考に記述していますが、
セルを別ファイルに書いている例がなく、躓きました。
該当のソースコード
#####PlanDetailsViewController.swift
予定詳細画面
Swift
1import UIKit 2 3class PlanDetailsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 4 5 let planItem = ["参加者","場所","共有開始","通知"] 6 7 var PlanTitle: String? 8 var DateAndTime: String? 9 10 @IBOutlet weak var DateAndTimeLabel: UILabel! 11 12 override func viewDidLoad() { 13 super.viewDidLoad() 14 15 if let DateAndTime = self.DateAndTime { 16 DateAndTimeLabel.text = DateAndTime 17 } 18 19 if let PlanTitle = self.PlanTitle { 20 self.navigationItem.title = PlanTitle 21 } 22 } 23 24 /* 25 26 省略 27 28 */ 29 30 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 31 32 guard let identifier = segue.identifier else { 33 return 34 } 35 36 if identifier == "editPlan" { 37 let addPlanVC = segue.destination as! AddPlanViewController 38 addPlanVC.PlanTitle = self.PlanTitle 39 40 let indexPath = IndexPath(row: 0, section: 0) 41 if let cell = addPlanVC.addPlanTable.cellForRow(at: indexPath) as? DateAndTimeCell { // ここにエラー 42 cell.DateAndTime = self.DateAndTime 43 } else { 44 print("nil") 45 } 46 } 47 } 48 49}
#####DateAndTimeCell.swift
編集画面(AddPlanViewController)の日時セル
Swift
1import UIKit 2 3class DateAndTimeCell: UITableViewCell { 4 5 @IBOutlet weak var displayDateAndTimeTextField: UITextField! 6 7 var datePicker: UIDatePicker = UIDatePicker() 8 var DateAndTime: String? 9 10 override func awakeFromNib() { 11 super.awakeFromNib() 12 13 if let DateAndTime = self.DateAndTime { 14 print("(DateAndTime) - DateAndTimeCell.swift") 15 self.displayDateAndTimeTextField.text = DateAndTime 16 } 17 18 /* 19 20 省略 21 22 */ 23 } 24 25 override func setSelected(_ selected: Bool, animated: Bool) { 26 super.setSelected(selected, animated: animated) 27 } 28} 29
試したこと
事をややこしくするかもしれませんが……
AddPlanViewController.swiftのほうで処理を書けないか試しました。
エラーは出ませんが、TextFieldに最初から日時が出力されることはありませんでした。
#####PlanDetailsViewController.Swift
予定詳細画面 prepare部分
Swift
1override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 2 3 guard let identifier = segue.identifier else { 4 return 5 } 6 7 if identifier == "editPlan" { 8 let AddPlanVC = segue.destination as! AddPlanViewController 9 AddPlanVC.PlanTitle = self.PlanTitle 10 AddPlanVC.DateAndTime = self.DateAndTime 11 } 12}
#####AddPlanViewController.swift
編集画面
Swift
1import UIKit 2 3class AddPlanViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 4 5 var PlanTitle: String? 6 var DateAndTime: String? 7 8 @IBOutlet weak var addPlanTable: UITableView! 9 @IBOutlet weak var PlanTitleTextField: UITextField! 10 11 // キャンセルボタン 12 @IBAction func cancelButton(_ sender: Any) { 13 self.dismiss(animated: true, completion: nil) 14 } 15 16 // 保存ボタン 17 @IBOutlet weak var saveButton: UIBarButtonItem! 18 19 var planItem = ["日時","参加者","場所","共有開始","通知"] 20 21 override func viewDidLoad() { 22 super.viewDidLoad() 23 24 if let PlanTitle = self.PlanTitle { 25 self.PlanTitleTextField.text = PlanTitle 26 } 27 28 if let DateAndTime = self.DateAndTime { 29 print("(DateAndTime) - 1段階目") 30 31 let indexPath = IndexPath(row: 0, section: 0) 32 if let cell = addPlanTable.cellForRow(at: indexPath) as? DateAndTimeCell { 33 print("(DateAndTime) - 2段階目") 34 cell.displayDateAndTimeTextField.text = DateAndTime 35 } else { 36 return 37 } 38 } 39 } 40 41 func tableView(_ tableView: UITableView, cellForRowAt indexPath:IndexPath) -> UITableViewCell { 42 var lineupCell: UITableViewCell 43 if indexPath.row == 0 { 44 lineupCell = tableView.dequeueReusableCell(withIdentifier: "DateAndTimeCell", for:indexPath) as UITableViewCell 45 } else { 46 lineupCell = tableView.dequeueReusableCell(withIdentifier: "ParticipantCell", for:indexPath) as UITableViewCell 47 } 48 lineupCell.textLabel?.text = planItem[indexPath.row] 49 return lineupCell 50 } 51 52 /* 53 54 省略 55 56 */ 57}
("(DateAndTime) - 1段階目") はprintされますが
("(DateAndTime) - 2段階目") はprintされませんでした。
補足情報(FW/ツールのバージョンなど)
Xcode 11.5
Swift 4.2
ここまで読んでくださり、ありがとうございます。
コードをかなり省略してしまったので、全体像がわかるほうが回答しやすいのであればお申し付けください。
回答1件
あなたの回答
tips
プレビュー