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

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

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

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

Q&A

解決済

2回答

1278閲覧

segueを使って値を渡した時の呼ばれる順番について。

atk_721

総合スコア62

Swift

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

0グッド

0クリップ

投稿2020/04/14 06:26

前提・実現したいこと

Segueを用いてProfileViewから、自作のクラスをEditViewに渡して表示したい。
現状ではボタンが押された時、EditViewに遷移して、値をもとに各Fieldに表示された直後、アプリが落ちてしまします。

EditVCのprint()がなぜ、二回呼ばれるのか分からず困っています。
二回目のEditVCのprint()が呼ばれた時に、なぜnilなのかも理解できていません。

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

Fatal error: Unexpectedly found nil while unwrapping an Optional value

###ProfileViewのボタンがをされた時の処理

@IBAction func editProfileTaped(_ sender: Any) { print("Tap") let userData: UserModel = userProfile! print("userData Name :",userData.userName) performSegue(withIdentifier: "edit", sender: userData) print("userData ID :",userData.userId) } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "edit" { let editVC = segue.destination as? EditViewController print("Sender 1 ",sender as Any) editVC?.userProfile = sender as? UserModel print("Sender 2 ", sender as Any) } }

EditViewのViewDidLoad()

override func viewDidLoad() { super.viewDidLoad() print("EditVC userProfile",userProfile) userIconView.sd_setImage(with: URL(string: userProfile!.userIcon), completed: nil) userNameLabel.text = userProfile!.userName ageLabel.text = String(userProfile!.userAge) genderSegmented.selectedSegmentIndex = genderConvertInt(Gender: userProfile!.userGender) DescriptionTextView.text = userProfile?.Description }

###ログとエラー箇所
イメージ説明

補足情報(FW/ツールのバージョンなど)

swift5
xcode Version 11.4 (11E146)

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/04/14 07:03 編集

間違えました
guest

回答2

0

根本的な解決にはならないかもしれませんが、次のように変えたらどうなりますか。
予想ですが、EditViewに行く前にこのメソッドでエラーになるのではないでしょうか。

Swift

1override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 2 3 if segue.identifier == "edit" { 4 5 let editVC = segue.destination as! EditViewController 6 7 print("Sender 1 ",sender as Any) 8 editVC?.userProfile = sender as! UserModel 9 print("Sender 2 ", sender as Any) 10 } 11}

参考になるかわかりませんが、一例を載せておきます。
Segueの呼び出し方の例
上記の例では、senderにはViewControllerのインスタンス(self)を指定して、渡したいデータは行き先のEditVCのメンバーにセットしてしまうという感じです。

投稿2020/04/14 06:58

freemann

総合スコア264

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

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

atk_721

2020/04/14 12:21

回答ありがとうございます!皆さんの回答のおかげで、無事解決する事が出来ました!ありがとうございました!
guest

0

ベストアンサー

Storyboard でボタンから遷移先に矢印を引っ張って segue を作ると、ボタンが押されたときにはそのボタンを sender として segue が実行されます。さらにボタンのアクションで performSegue すれば segue は二重に実行されてしまいます。

解決方法は、

  • 遷移元の view controller から矢印を引っ張って segue を作れば、その segue が自動的に呼ばれることはありません。
  • 今回のコードでは editProfileTaped では大したことをしてないので、ボタンのアクションを消して、prepare(for segue:) で sender は無視して self.userProfile を渡すようにしてもいいと思います。

投稿2020/04/14 06:58

hoshi-takanori

総合スコア7901

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

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

atk_721

2020/04/14 12:20

回答ありがとうございます!ご指摘の通り、ボタンから引っ張ってSegueを作っていました。一度切って、VProfileViewから繋ぎ直した所、Segueの実行は一度で思った処理にすることができました!的確な助言をありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問