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

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

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

MVP(Minimum Viable Product)とは、「必要最低限の機能を兼ね備えた製品」を指します。企画書などを完成させる前に、とりあえず製品を形にする方法です。プロトタイプなどで一旦アウトプットさせることにより、無駄なコストや時間を削減できます。

Swift

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

Q&A

解決済

1回答

2743閲覧

MVP構成で画面を戻る時にpresenter -> presenterへ値を渡す方法

hameji

総合スコア1380

MVP

MVP(Minimum Viable Product)とは、「必要最低限の機能を兼ね備えた製品」を指します。企画書などを完成させる前に、とりあえず製品を形にする方法です。プロトタイプなどで一旦アウトプットさせることにより、無駄なコストや時間を削減できます。

Swift

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

0グッド

0クリップ

投稿2019/11/20 20:02

編集2019/11/21 02:09

質問させてください。

現在アプリをMVPパターンで作成しています。
NavigationControllerの下にviewControllerA -> viewControllerB
と配置しています。それぞれにpresenterを持っています。
データはpresenterが持っている状態です。

順当に次にshowでviewを表示する時はデータを普通にsegueで渡せばいいのですが、
逆に戻る時データを渡すのはどのようにするのが一般的なのでしょうか?

例えば、住所録などのアプリで、各ユーザーに勤務先会社情報を持たせる場合、
会社情報をviewControllerBで入力した場合、入力し終わり戻る時、
そのデータをpresenterから1個上の階層のpresenterに渡したいのですが、
どのように実限するべきなんでしょうか?

下の階層に渡すページはいくらでもありますが、
逆に戻る時にデータを渡す方法が解説されているページは調べてもあまりなさそうでした。

presenterB (storyboardID利用)-> veiwcontrollerA (ただのfunc)-> presenterA へ
橋渡しすればできますか???
-> 試してみましたが、できませんでした。

追伸、サンプルコードかなりアバウトに書いてて、間違ってました。修正しました。

Swift

1struct AddressBook { 2 let user: String 3 let companyInfo: CompanyInfo? 4} 5 6strunt CompanyInfo { 7 let name: String 8 let address: String 9 let tel: String 10} 11 12//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ 13// ViewControllerA 14import UIKit 15class ViewAViewController: UIViewController { 16 private let viewAPresenter = viewAPresenter() 17 var addressBook: AddressBook = AddressBook(user: "田中太郎", companyInfo: nil) 18} 19 override func viewDidLoad() { 20 self.viewAPresenter.viewA = self 21 } 22 23 override func viewWillAppear(_ animated: Bool) { 24 self.viewAPresenter.viewWillAppear(data: addressBook) 25 } 26} 27extention ViewAViewContorller: ViewDelegate { 28} 29 30// ViewAPresenter 31import Foundation 32class ViewAPresenter { 33 weak var ViewA: AddHospitalDelegate? 34 var addressBook: AddressBook! 35 36 func viewWillAppear(data: AddressBook) { 37 self.addressBook = data 38 print(self.addressBook) 39 } 40} 41 42// ViewADelegate 43protocol ViewADelegate : class { 44} 45 46//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ 47// ViewControllerB 48import UIKit 49class ViewBViewController: UIViewController { 50 private let viewBPresenter = viewBPresenter() 51 override func viewDidLoad() { 52 self.viewBPresenter.viewB = self 53 } 54 55 override func viewWillDisappear(_ animated: Bool) { 56 self.viewBPresenter.viewWillDisappear() 57 } 58} 59 60extention ViewBViewContorller: ViewDelegate { 61} 62 63// ViewBPresenter 64import Foundation 65class ViewBPresenter { 66 weak var ViewB: AddHospitalDelegate? 67 var companyInfo:CompanyInfo = CompanyInfo(name: "A会社", address: "B県C市", tel: "0XX-XXX-XXXX") 68 69 func viewWillDisappear() { 70 // 下記ダメでした 71 let viewAPresenter = ViewAPresenter() 72 viewAPresenter.Addressbook.companyInfo = companyInfo 73 // 下記もダメでした 74 let viewA = self.storyboard?.instantiateViewController(withIdentifier: "viewA") as! ViewAViewController 75 viewA.addressbook.companyInfo = companyInfo 76 } 77} 78 79// ViewBDelegate 80protocol ViewBDelegate : class { 81}

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

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

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

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

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

guest

回答1

0

ベストアンサー

MVPは判りませんが、

// 下記ダメでした

let viewAPresenter = ViewAPresenter()
// 下記もダメでした
let viewA = self.storyboard?.instantiateViewController(withIdentifier: "viewA") as! ViewAViewController

上記はどちらの方法も「新しくインスタンスを生成している」ので駄目ですね。
やりたいことは「既存のインスタンスへのアクセス」かと思います。

NavigationControllerにぶら下がっているだけであれば、
https://qiita.com/superman9387/items/e913f7edbc8ea35f1471
の方法で前のViewControllerへのインスタンスへはアクセスできます。

もしモーダルとして呼ばれた側のViewControllerであれば、presentingViewControllerプロパティから呼び出し元のViewControllerにはアクセスできます。

ViewControllerの派生クラスで、何かしらのインスタンスを取得し、プレゼンターにそのインスタンスをバケツリレーしてやれば、動作するにはするのかなと思います。
MVPとやらの設計思想にそぐうのかまでは判らないので、その辺りは詳しい方にお任せします。

#強結合が嫌なのであれば、クロージャやプロトコルを使って疎結合にする方法もあるにはあります。

投稿2019/11/21 06:21

takabosoft

総合スコア8356

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

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

hameji

2019/11/21 06:42 編集

takabosoftさん、ありがとうございます。 教えていただいた方法で無事実装することができました。 viewBPresenter -> viewBViewController -> viewAViewController -> viewAPresenterと バケツリレーになってしまうのは仕方がないのかなと思っています。 時間がある時に、別の方法での実装等を再度考えてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問