2〜3ヶ月ほど前からネットの情報を頼りにSwiftを触りはじめました。
質問の仕方に至らぬ点があるかもしれませんが、どうぞよろしくお願いいたします。
前提・実現したいこと
現在、セルクリックでDatePickerを表示し、選択した日時をセル内のTextField(枠なし)に出力しています。
この選択した日時を、「保存」ボタンクリックによる遷移先(receiveTestViewController)のLabelに表示したいです。
この右ページの真ん中に。
発生している問題・エラーメッセージ
TextFieldに関してはAddPlanViewController.swiftではなく別ファイル(DateAndTimeCell.Swift)に記述しており、ファイル・クラスをまたいでのやりとりに慣れておらず苦戦しています。
Build自体はできるのですが、「保存」ボタンを押したときに以下のメッセージが出て次に進めません。
Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
該当のソースコード
#####AddPlanViewController.swift
全体
Swift
1import UIKit 2 3class AddPlanViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 4 5 // キャンセルボタン 6 @IBAction func cancelButton(_ sender: Any) { 7 self.dismiss(animated: true, completion: nil) 8 } 9 10 // 保存ボタン 11 @IBAction func saveButton(_ sender: Any) { 12 print("保存ボタンがタップ") 13 } 14 15 var planItem = ["日時","参加者","場所","共有開始","通知"] 16 17 override func viewDidLoad() { 18 super.viewDidLoad() 19 20 // タイトル文字列の設定 21 self.navigationItem.title = "予定を追加" 22 } 23 24 func tableView(_ tableView: UITableView, cellForRowAt indexPath:IndexPath) -> UITableViewCell { 25 var cell: UITableViewCell 26 if indexPath.row == 0 { 27 cell = tableView.dequeueReusableCell(withIdentifier: "DateAndTimeCell", for:indexPath) as UITableViewCell 28 29 } else { 30 cell = tableView.dequeueReusableCell(withIdentifier: "ParticipantCell", for:indexPath) as UITableViewCell 31 } 32 cell.textLabel?.text = planItem[indexPath.row] 33 return cell 34 } 35 36 func tableView(_ tableView: UITableView, numberOfRowsInSection section:Int) -> Int { 37 return planItem.count 38 } 39 40 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 41 print("(indexPath.row)番セルをタップ") 42 tableView.deselectRow(at: indexPath, animated: true) // セルの選択を解除 43 44 if indexPath.row == 0 { 45 if let cell = tableView.cellForRow(at: indexPath) as? DateAndTimeCell{ 46 cell.displayDateAndTime.becomeFirstResponder() 47 } 48 } else { 49 // 0番セル以外をクリックしたらキーボードを閉じる 50 view.endEditing(true) 51 } 52 } 53 54 override func prepare(for segue: UIStoryboardSegue, sender: Any!) { 55 if (segue.identifier == "toreceiveTestVC") { 56 let VC: receiveTestViewController = (segue.destination as? receiveTestViewController)! 57 VC.receiveData = DateAndTimeCell().displayDateAndTime.text! 58 } 59 } 60}
該当箇所はここですかね?
Swift
1override func prepare(for segue: UIStoryboardSegue, sender: Any!) { 2 if (segue.identifier == "toreceiveTestVC") { 3 let VC: receiveTestViewController = (segue.destination as? receiveTestViewController)! 4 VC.receiveData = DateAndTimeCell().displayDateAndTime.text! 5 } 6 }
#####DateAndTimeCell.swift
こちらでセル内のTextFieldを紐付け、Datepickerの指定もしています。
全体
Swift
1import UIKit 2 3class DateAndTimeCell: UITableViewCell { 4 5 @IBOutlet weak var displayDateAndTime: UITextField! 6 var datePicker: UIDatePicker = UIDatePicker() 7 8 override func awakeFromNib() { 9 super.awakeFromNib() 10 // ピッカー設定 11 datePicker.datePickerMode = UIDatePicker.Mode.dateAndTime 12 datePicker.timeZone = NSTimeZone.local 13 datePicker.locale = Locale.current 14 displayDateAndTime.inputView = datePicker 15 16 // 決定バーの生成 17 let toolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 40)) 18 let spacelItem = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil) 19 let doneItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(done)) 20 toolbar.setItems([spacelItem, doneItem], animated: true) 21 // インプットビュー設定(紐づいているUITextfieldへ代入) 22 displayDateAndTime.inputView = datePicker 23 displayDateAndTime.inputAccessoryView = toolbar 24 } 25 26 @objc func done() { 27 displayDateAndTime.endEditing(true) 28 29 // 日付のフォーマット 30 let formatter = DateFormatter() 31 32 //日本仕様で日付の出力 33 formatter.timeStyle = .short 34 formatter.dateStyle = .full 35 formatter.locale = Locale(identifier: "ja_JP") 36 37 //datePickerで指定した日付が表示される 38 displayDateAndTime.text = "(formatter.string(from: datePicker.date))" 39 } 40 41 override func setSelected(_ selected: Bool, animated: Bool) { 42 super.setSelected(selected, animated: animated) 43 } 44}
#####receiveTestViewController.swift
遷移先です。
全体
Swift
1import UIKit 2 3class receiveTestViewController: UIViewController { 4 5 @IBOutlet weak var displayDateAndTimeLabel: UILabel! 6 var receiveData: String = "" 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 displayDateAndTimeLabel.text = receiveData 11 } 12}
試したこと
Labelの値の受け渡しは、こちらの記事を参考に記述しました。
加えて、以前の質問でダウンキャストのことなどを教えていただいたので調べてみましたが、うまく応用できませんでした。
補足情報(FW/ツールのバージョンなど)
Xcode Version 10.1
ここまで読んでくださり、ありがとうございます。
稚拙な質問かもしれませんが、どうぞよろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/23 23:36