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

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

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

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

Swift

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

3回答

2534閲覧

【swift】モーダルで行った処理を元のビューに反映させたい

nyancoro

総合スコア75

iOS

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

Swift

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2016/03/29 06:44

swiftを勉強中の者です。

あるView(A画面)からモーダルでView(B画面)を表示させ、
そこで行った処理(具体的はUserDefaultsの書き換え)を元のビュー(A画面)に反映させたいと思っています。

A画面のviewDidAppear内に処理を書けば実行されるものと思っていたのですが、

swift

1dismissViewControllerAnimated(true, completion: nil)

で戻るとviewDidAppearは通らないことがわかりました。

どうしたら元のビューに反映ができるのでしょうか?
ご教授頂けると幸いです。

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

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

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

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

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

guest

回答3

0

A画面のviewDidAppearは呼ばれるはずです。
本当に呼ばれていないのか、それとも、呼ばれているけど反映されないのか、まずは確認してみるのが良いと思います。

ちなみに、こちらのテストではdismissViewControllerAnimated以降の処理の流れは下記のようになっています。

[A画面] viewWillAppear [B画面] viewWillLayoutSubviews [B画面] viewDidLayoutSubviews [A画面] viewWillLayoutSubviews [A画面] viewDidLayoutSubviews [A画面] viewDidAppear [A画面] viewWillLayoutSubviews [A画面] viewDidLayoutSubviews

投稿2016/03/30 07:25

fuzzball

総合スコア16731

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

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

0

ベストアンサー

delegateを使って値の受渡しをしてはどうでしょうか。

  1. B画面にA画面の型でdelegateのプロパティを用意
  2. A画面にUserDefaultsからの読み出しを実行できるメソッドを用意
  3. A画面からB画面を呼び出すときにdelegateにself(A画面)をセット
  4. B画面でUserDefaultsの書き込み完了後から画面破棄までのどこかのタイミングでdelegate.2)のメソッドを実行

注意点としては、メモリリークを避けるために1)のプロパティはweakで持つことです。

投稿2016/03/29 08:06

kubothink

総合スコア21

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

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

nyancoro

2016/03/30 03:30

ご回答ありがとうございます! 回答を参考に調べてみると以下のような記事を見つけたのですが、おっしゃているのはこのことでしょうか…? >http://www.masaplabs.com/swift-delegate-sample/ 2点追加で質問させて頂きたいのですが、 ●メモリリークについて 未熟なものでweakを意識的に使ったことがないのですが、上記記事の 「var delegate: DetailViewControllerDelegate!」 のところをweakにしたほうがいいという認識で合っていますでしょうか? ●落ちる 記事ベースの話になってしまい恐縮なのですが、 上記記事を自分のプロジェクトで実行すると、 呼び出し側の「self.delegate.changeText("This text was changed by delegate.")」のところで落ちてしまいます。 →fatal error: unexpectedly found nil while unwrapping an Optional value これは単に私の実装ミスなのでしょうか? 御手数おかけしますが、こちらもご教授頂けると幸いです。 何卒よろしくお願い致します。
kubothink

2016/03/30 05:50

なるほど。丁度良い例ですね。 >「var delegate: DetailViewControllerDelegate!」 >のところをweakにしたほうがいいという認識で合っていますでしょうか? その通りです。 >落ちる ブレークポイントを張って確認してみていただきたいのですが、その行で使ういずれかの変数がnilになっていませんでしょうか? まずはそこから調査するのが良いかと思います。 恐らくそのメッセージからするとdelegateでしょうか? だとすると、DetailViewControllerの32行目、delegateにselfをセットしていないのでは?と推察しますが如何でしょうか。
nyancoro

2016/03/30 07:04

ご丁寧にありがとうございます! >だとすると、DetailViewControllerの32行目、delegateにselfをセットしていないのでは?と推察しますが如何でしょうか。 ブレークポイントをはってみると、仰るとおりdelegateがnilになっておりましたm(__)m しかしサイトで言うところの32行目にselfをセットしてもなお落ちるのが解消されません。 他のサイトも参考に自分のコードと見比べてみたのですが、なぜnilになってしまうのかがわかりません。 恐縮ながらこちらに自分が書いたコードを載せさせて頂きますので、ミスがありましたらおしゃって頂けると大変助かります^^; 【A画面:HomeViewController】 protocol HomeViewControllerDelegate: class { func changeBackground() } class HomeViewController: UIViewController, HomeViewControllerDelegate { ・・・ // MARK: - HomeViewControllerDelegate func changeBackground() { 処理 } } @IBAction func toChangeBackground(sender: AnyObject) { let changeBackgroundViewController = ChangeBackgroundViewController() changeBackgroundViewController.delegate = self guard let nex = self.storyboard!.instantiateViewControllerWithIdentifier("ChangeBackground") as? ChangeBackgroundViewController else { return } nex.modalPresentationStyle = UIModalPresentationStyle.OverFullScreen self.presentViewController(nex as UIViewController, animated: true, completion:nil) } } 【B画面:ChangeBackgroundViewController】 class ChangeBackgroundViewController: UIViewController { weak var delegate: HomeViewControllerDelegate? = nil ・・・ @IBAction func ButtonPushed(sender: AnyObject) { dismissViewControllerAnimated(true, completion: { self.delegate!.changeBackground() }) }
kubothink

2016/03/30 09:15

メソッドtoChangeBackgroundの中で、ChangeBackGroundViewControllerのインスタンスを2つ生成していますね。 実際にpresenteViewControllerの引数として使っているのは変数nexの方のインスタンスですが、こちらにはdelegateがセットされておらず、使っていない変数changeBackgroundViewControllerの方にセットしている事が原因だと推察されます。 このコードの範囲だけで判断すると、 どうやらStoryboardからモーダル画面を取得したいように見えるので、ChangeBackgroundViewControllerを直接生成している1行目とそれを使った2 行目は不要だと思われます。
nyancoro

2016/03/30 09:42

たしかに仰るとおりでした。。。m(__)m おかげさまで無事に動作させることができました! 今回はdelegateを知る良い機会となりました。 親切にご教授くださり、kubothinkさまには大変感謝しております。 本当にありがとうございました!
guest

0

self.dismissViewControllerAnimated(true, completion: { self.delegate?.DidFinishedModal() )

のようにデリゲートを使ってモーダルの内容を別のVCに渡すことができます

投稿2016/03/29 08:03

編集2016/03/29 08:04
yuta_nishimori

総合スコア19

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

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

nyancoro

2016/03/30 09:39

ご回答ありがとうございましたm(__)m おかげさまで無事解決いたしました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問