21479


いつもお世話になってます  
今、iPadアプリの開発をしています。  
親ビューからモーダルで数値入力をした後、親ビューへ値を返すのはどのようにしたらいいでしょうか？  
[![画像の説明をここに入力](https://i.stack.imgur.com/KZ2Ml.jpg)](https://i.stack.imgur.com/KZ2Ml.jpg)

delegateを使って値の引き渡しをしようと考えたのですが、

[code]

    self.dismissViewControllerAnimated(true, completion: nil)
    
[/code]

でモーダルを消すと親ビューの方の

[code]

    override func viewWillAppear(animated: Bool) {
    
[/code]

が動いてくれませんでした。


CC BY-SA 3.0
2016-01-29T11:35:02.430
21477
2016-01-30T00:51:29.263
8044
question
ios swift
Modalから値を受け取る処理


モーダルでは、`UIViewController`のプロパティ`presentingViewController`で、「親」ViewControllerを取得できます。

親ViewControllerを`ViewController`とし、モーダルを閉じた時の処理を行うメソッド`doAnything()`が実装されているとします。ボタンアクション`closeModal()`でモーダルを閉じます。

[code]

    @IBAction func closeModal(sender: AnyObject) {
        if let controller = self.presentingViewController as? ViewController {
            controller.doAnything()
            controller.dismissViewControllerAnimated(true, completion: nil)
        }
    }
    
[/code]

`doAnything()`に引数を定義するとか、プロパティと置き換えるとかすれば、変数の受け渡しが可能になります。  
しかし、Navigation Controllerがあるなど、View
Controllerが多層状態の場合、`presentingViewController`は、基底（いちばん下の）View
Controllerを返しますから、期待どおりの結果になりません。単にNavigation Controllerだけがあるのなら、

[code]

    @IBAction func closeModal(sender: AnyObject) {
        if let navigationController = self.presentingViewController as? UINavigationController,
        let controller = navigationController.topViewController as? ViewController {
            controller.doAnything()
            controller.dismissViewControllerAnimated(true, completion: nil)
        }
    }
    
[/code]

と書きかえればすみますが、より汎用的な記述を求めるなら、  
(1) Delegateを実装する。  
(2) Storyboardで、Unwind Segueを利用する。  
が考えられます。（ _さらに回答をお求めなら、質問文を更新して、どういう方針でいきたいか、明記してもらえると、それに対して回答する用意はあります_ ）


CC BY-SA 3.0
2016-01-29T12:05:55.153
21479
2016-01-30T00:51:29.263
2016-01-30T00:51:29.263
7362
7362
21477
answer