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

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

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

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

Swift

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

Q&A

解決済

1回答

4027閲覧

Swiftでの画面遷移に伴う値渡しができません。。nilが入っているとエラーが出ます。

Harumaki_

総合スコア11

Xcode

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

Swift

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

0グッド

0クリップ

投稿2019/07/17 20:25

初めの画面(FirstView)のテキストフィールドに入力された文字列を、画面遷移後(GOを押下)の次の画面(SecondView)のラベルに表示させたいです。しかし、どうもprepareメソッドがうまくいきません。

StoryBoardの画面です。
イメージ説明


[FirstViewです↓]
import UIKit
class FirstViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad() }

@IBOutlet weak var send_text: UITextField! //入力されるテキスト override func prepare(for segue: UIStoryboardSegue, sender: Any?) { guard let identifier = segue.identifier else { return } if(identifier == "sendingmessege") { let secondScreenText = segue.destination as! SecondViewController secondScreenText.receive_text.text = self.send_text.text //ここにエラー

//エラー内容です↓
//Thread 1: Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value
}}}


[SecondViewです↓]
import UIKit
class SecondViewController: UIViewController {

@IBOutlet weak var receive_text: UILabel! //FirestViewから送られてくるテキストを受け取るラベル override func viewDidLoad() { super.viewDidLoad() }

}

その他の情報です。以下の画像をご覧ください。イメージ説明

原因をご教授いただけるととても嬉しいです。よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

遷移先の SecondViewController の UILabel が
prepare 関数実行時はまだ生成されていないため値渡しに失敗しているようです。
viewDidLoad()が呼ばれないと。
なので SecondViewController 側で String 型のプロパティを宣言して値を受け取ります。

swift

1// FirstViewController.swift 2import UIKit 3 4class FirstViewController: UIViewController { 5 6 @IBOutlet weak var send_text: UITextField! //入力用テキストフィールド 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 } 11 12 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 13 // Segue の Identifier が nil または sendingmessege でない場合は処理を抜ける 14 guard let identifier = segue.identifier, 15 identifier == "sendingmessege" else { 16 return 17 } 18 // Segue の行き先が SecondViewController かを確認 19 if let secondViewController = segue.destination as? SecondViewController { 20 // プロパティにテキストフィールドの値を渡す 21 secondViewController.receivedStr = self.send_text.text 22 } 23 } 24 25 // ボタン押下時の処理(ボタンから直接 Segue を出している場合は不要) 26 @IBAction func sendAction(_ sender: Any) { 27 performSegue(withIdentifier: "sendingmessege", sender: nil) 28 } 29}

swift

1// SecondViewController.swift 2import UIKit 3 4class SecondViewController: UIViewController { 5 6 @IBOutlet weak var receive_text: UILabel! 7 // FirestViewController から送られてくる文字列を受け取るプロパティを追加 8 var receivedStr: String? 9 10 override func viewDidLoad() { 11 super.viewDidLoad() 12 // Optional にしたので nil の可能性もあるのでチェック 13 if let receivedText = self.receivedStr { 14 // nil ではなかった場合は Label に表示 15 self.receive_text.text = receivedText 16 } 17 } 18}

投稿2019/07/17 21:05

編集2019/07/17 21:10
TakuyaAso

総合スコア1361

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問