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

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

新規登録して質問してみよう
ただいま回答率
85.46%
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

解決済

2回答

2518閲覧

遷移先の画面Bで変更した値を、画面Aに戻った時にも使えるように更新したい

ryo_py

総合スコア25

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/02/11 16:25

実現したいこと

遷移先の画面Bで変更した値を、画面Aに戻った時にも使えるように更新したいです。

前提・問題

ViewController.swift, // メインの画面
SettingViewController.swift, // 設定画面
GetData.swift // 主にデータと、データの処理を行うファイル
という3つのファイルがあります。SettingViewController.swiftのsteperで変数aの値を変更し、その後、変数aを変更後の値として使い続けたいですが、最初に初期化した値のまま変わらず、更新されません。

GetData.swift

swift

1struct GetData { 2 var a: Int = 0 3}

SettingViewController.swift

swift

1@IBAction func workTimeSteperPressed(_ sender: UIStepper) { 2 label.text = String(format: "%.0f", sender.value) 3 changeA = Int(sender.value) 4}

試したこと

SettingViewController.swiftに以下のコードを追加してみましたがダメでした。

swift

1override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 2 if segue.identifier == "Identifier" { 3 let destinationVC = segue.destination as! ViewController 4 destinationVC.getData.workTime = changeA 5 } 6}

※実際のコードをかなり簡略化して記載してあるので、何か不足してる部分があれば教えてください

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

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

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

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

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

thyda.eiqau

2020/02/11 22:26

SettingViewControllerでセットした値を永続化する処理、GetDataで永続化された値を取り出してプロパティに代入する処理があるはずだと思いますが、そちらのコードをご提示ください。 あと、changeAが何かわかりません。
hoshi-takanori

2020/02/11 22:43

確認ですが、メイン画面と設定画面は一つの Storyboard 上にあって、セグエで画面遷移してるってことですよね。で、設定画面からメイン画面に戻る方法はどうやってますか? また、戻るセグエに Identifier を正しく設定できてますか?
ryo_py

2020/02/12 02:31

thyda.eiqauさん >SettingViewControllerでセットした値を永続化する処理、GetDataで永続化された値を取り出してプロパティに代入する処理 そのような処理おそらくは記述していません。 その記述をすれば、想定した処理になるのでしょうか?
ryo_py

2020/02/12 02:45

すみません。changeAは試行錯誤している間に変えたコードで、元はgetData.aです。
ryo_py

2020/02/12 02:54

hoshi-takanoriさん >メイン画面と設定画面は一つの Storyboard 上にあって、セグエで画面遷移してるってことですよね。 そうです。 設定画面の上部を下にスワイプすればメイン画面に戻れるので、戻るボタンは追加するつもりですが、今のところは戻るための処理は書いていません。(戻るボタンを追加して`self.dismiss(animated: true, completion: nil)`とするつもりです。) > 戻るセグエに Identifier を正しく設定できてますか? `ViewController.swift `に @IBAction func settingPressed(_ sender: UIButton) { self.performSegue(withIdentifier: "reuseIdentifier", sender: self) } mainstoryboard上の矢印のIdentifierにreuseIdentifierと記述して動作しています。 初心者なのでよく分からないのですが、その設定をしていないから更新されないのでしょうか?
hoshi-takanori

2020/02/12 03:46

あー、その場合は prepare(for segue:, sender:) は呼ばれないですね。ってか、元の画面がちょっとだけ見えてると思うので、Apple が推奨するお作法としては設定画面で何か変更があれば即座にメイン画面に反映させるべしってことかも。
ryo_py

2020/02/12 04:10

つまり、遷移方法を変えた方がいいということですか?
hoshi-takanori

2020/02/12 04:24

いえ、そのままでも大丈夫です。今から回答を書くので少々お待ちください。
ryo_py

2020/02/12 04:29

ありがとうございます。助かります!
guest

回答2

0

ベストアンサー

iOS 13 でモーダルビューから戻る新しい方法として画面上部を下にスワイプする方法が追加されました。
この方法でモーダルビューを閉じる時に処理を行うには、UIAdaptivePresentationControllerDelegate を利用します。

swift

1// メイン画面 2class ViewController: UIViewController { 3 4 // 略 5 6 // メイン画面から設定画面に遷移するときの処理を追加します。 7 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 8 // メイン画面から設定画面に遷移するセグエが reuseIdentifier の場合、 9 if segue.identifier == "reuseIdentifier" { 10 // 戻るときの処理を設定画面で行うための設定。 11 segue.destination.presentationController?.delegate = segue.destination as! UIAdaptivePresentationControllerDelegate 12 } 13 } 14 15}

swift

1// 設定画面に UIAdaptivePresentationControllerDelegate プロトコルを追加します。 2class SettingViewController: UIViewController, UIAdaptivePresentationControllerDelegate { 3 4 // 略 5 6 // メイン画面に戻る画面遷移が開始する時に呼ばれます。 7 func presentationControllerWillDismiss(_ presentationController: UIPresentationController) { 8 // メイン画面の ViewController を取得。 9 let destinationVC = presentationController.presentingViewController as! ViewController 10 // メイン画面に値を返す。 11 destinationVC.getData.workTime = changeA 12 } 13 14}

投稿2020/02/12 04:38

hoshi-takanori

総合スコア7895

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

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

ryo_py

2020/02/12 05:22

上記のコードを書くと想定通りに動作しました! ほぼ独学でやっているので、本当に助かりました。 ありがとうございます!!!
guest

0

destinationVC.getData.workTime = changeA

まずこのコードが通っているかを

print(destinationVC.getData.workTime)

などと書いて実行してみてください。
ここが通っていればViewController.getData.workTimeの値自体は変わっていると思います。

#getDataが複製を返しているとかでなければ

あとは、値を変えただけでは画面には勝手には反映されませんので、必要であればUIの更新を掛けてください。

投稿2020/02/12 02:20

takabosoft

総合スコア8356

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

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

ryo_py

2020/02/12 03:06

`print(destinationVC.getData.workTime)`と書いてみましたが出力すらされなかったので、override func prepareの部分が処理されていないということですよね?。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問