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

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

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

484閲覧

Swiftのデータの受け渡し

ymwtskm

総合スコア23

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グッド

2クリップ

投稿2018/01/17 00:12

編集2018/01/17 11:06

Swiftで2つ目の画面から1つ目の画面にデータの受け渡しをしたい。

2つ目の画面のアラートのOKボタンを押したら1つ目の画面にデータを受け渡すためにはどうすればいいですか。

//2つ目の画面から1つ目の画面に返ってきたとき(1つ目の画面) override func viewWillAppear(_ animated: Bool) { let userDefaults = UserDefaults.standard if let storedList = userDefaults.array(forKey: "score") as? [String] { score.append(contentsOf: storedList) }
//OKボタンを押したときのメソッド(2つ目の画面) let okButton = UIAlertAction(title: "OK", style: .default, handler: { (action) in  let userDefaults = UserDefaults.standard  self.score.insert(self.label.text!, at: 0)  userDefaults.set(self.score, forKey: "score")  userDefaults.synchronize()  self.dismiss(animated: true, completion: nil) })
//2つ目の画面を起動したとき override func viewDidLoad() { super.viewDidLoad() let userDefaults = UserDefaults.standard if let storedList = userDefaults.array(forKey: "score") as? [String] { score.append(contentsOf: storedList) } }

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

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

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

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

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

komo_ta

2018/01/17 02:16

適切な回答をもらうために、どういったデータなのかなど、もう少し詳細書かれた方がいいかもしれません。書いていただければ自分も答えやすいです〜
ymwtskm

2018/01/17 11:07

なるほど。参考になります。
guest

回答1

0

ベストアンサー

やり方はたくさんありますが、設計によって最善のやり方が変わって来ますのでとりあえずいくつか案を挙げておきます:

  1. 共通のモデルオブジェクトを持たせます。2つ目の画面のOK押した時にモデルオブジェクトにデータを渡せば、1つ目の画面もそのモデルオブジェクトにアクセスしてそのデータを取れます

  2. NotificationCenterを使います。1つ目の画面の特定のNotificationを購読して、2つ目の画面のOKボタンを押した時にNotificationCenterを通じて渡したいデータと一緒にそのNotificationを出せば1つ目の画面がそのデータを受け取れます

  3. 1つ目の画面に2つ目の画面の参照をもたせます。2つ目の画面のOKボタンを押したら1つ目の画面が2つ目の画面を参照し渡してほしいデータを読み取ります。

まあやり方はいくらでもありますが、全て設計次第、ですかね…?


追記

いただいたコードで書くとこんな感じですかね:

swift

1 // 2つ目のVC 2 3 // dismiss するときにscoreを処理する動作 4 private var onDismissScoreAction: ((_ scores: [String]) -> Void)? 5 6 // OKボタン押したとき 7 private(set) lazy var okButton = UIAlertAction(title: "OK", style: .default, handler: { (action) in 8 self.scores.insert(self.label.text!, at: 0) 9 self.dismiss(animated: true, completion: { 10 // dismiss終わったときにonDismissScoreActionを実行 11 self.onDismissScoreAction?(self.score) 12 }) 13 }) 14 15 16 // scoreを処理する動作を設定してもらうためのメソッド 17 func setOnDismissScoreAction(_ action: @escaping ([String]) -> Void) { 18 self.onDismissScoreAction = action 19 }

swift

1 // 1つ目のVC 2 3 // 遷移用のメソッド 4 func presetn2ndViewController() { 5 //2つ目のVC 6 let controller = ChildViewController() 7 //2つ目のVCから戻ったときに、受け取ったscoreを自分のscoreに追加 8 controller.setOnDismissScoreAction({ [weak self] in self?.score.append(contentsOf: $0) }) 9 self.present(controller, animated: true, completion: nil) 10 11 }

投稿2018/01/17 05:38

編集2018/02/01 06:02
lovee

総合スコア92

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

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

ymwtskm

2018/01/17 11:08

そんなに方法があるのですね。 コードをのせましたのでよろしければ見ていただけないでしょうかm(_ _)m
lovee

2018/02/01 05:45

遅くなってすみません、しばらくteratailに来てなくて… `viewWillAppear` でデータ取得するのは可能ですが、ただそれは例えばアプリをバックグラウンドに入ってまた戻ってくるときとかでも呼ばれますので、理想的な解決法とは言いにくいですね。 その代わり、遷移先のVCに「dismissするときにこれやっといてねー」という感じで、クロージャーを設定することが可能です。例えばこうです: ```swift // 2つ目のVC // dismiss するときにscoreを処理する動作 private var onDismissScoreAction: ((_ scores: [String]) -> Void)? // OKボタン押したとき private(set) lazy var okButton = UIAlertAction(title: "OK", style: .default, handler: { (action) in self.scores.insert(self.label.text!, at: 0) self.dismiss(animated: true, completion: { // dismiss終わったときにonDismissScoreActionを実行 self.onDismissScoreAction?(self.score) }) }) // scoreを処理する動作を設定してもらうためのメソッド func setOnDismissScoreAction(_ action: @escaping ([String]) -> Void) { self.onDismissScoreAction = action } ``` ```swift // 1つ目のVC // 遷移用のメソッド func presetn2ndViewController() { //2つ目のVC let controller = EditorViewController() //2つ目のVCから戻ったときに、受け取ったscoreを自分のscoreに追加 controller.setOnDismissScoreAction({ [weak self] in self?.score.append(contentsOf: $0) }) self.present(controller, animated: true, completion: nil) } ``` クロージャーというちょっと初心者には難しい仕組みを利用することになってしまいますが、こちらをマスターすればできることがものすごい増えてくるのでぜひ習得していただきたいスキルです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問