質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1069閲覧

別ファイルで指定している TextField の中身を遷移先の Label に表示したい

unagimochimochi

総合スコア7

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/06/23 12:45

2〜3ヶ月ほど前からネットの情報を頼りにSwiftを触りはじめました。
質問の仕方に至らぬ点があるかもしれませんが、どうぞよろしくお願いいたします。

前提・実現したいこと

現在、セルクリックでDatePickerを表示し、選択した日時をセル内のTextField(枠なし)に出力しています。

↓AddPlanViewController
DatePicker表示
セル内のTextFieldに出力

この選択した日時を、「保存」ボタンクリックによる遷移先(receiveTestViewController)のLabelに表示したいです。

Interface Builder

この右ページの真ん中に。

発生している問題・エラーメッセージ

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

ここまで読んでくださり、ありがとうございます。
稚拙な質問かもしれませんが、どうぞよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

prepareが呼ばれる先が不明なのでアレですが…、

DateAndTimeCell().displayDateAndTime.text!nilであると仮定して、

swift

1let indexPath = IndexPath(row: 0, section: 0) 2VC.receiveData = (tableViewのアウトレット接続名称.cellForRow(at: indexPath) as? DateAndTimeCell)?.displayDateAndTime.text ?? "" 3

で動くと思いますが、悪手でしょうね。

DateAndTimeCelldataPickerで設定した値をAddPlanViewControllerで保持するようにして、
遷移時にそこから値を取得するようにしてください。

それと細かいようですが、
class receiveTestViewController: UIViewController {

class ReceiveTestViewController: UIViewController {
で。

投稿2020/06/23 14:36

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

unagimochimochi

2020/06/23 23:36

的確なご回答ありがとうございます。 無事、遷移先のLabelに表示させることができました。 DateAndTimeCell.swiftから値を取り出す機会はこれからもあると思いますので、これを参考にいろいろ応用してみます。 クラス名のご指摘もありがとうございます。基礎をしっかりやる必要がありそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問