[iOS8] Swiftでdelegateを使ったモーダル間の値渡し

<p class="p1">モーダルを呼び出し、呼び出し元のコントローラーに値を渡す時のSwiftでの書き方について説明していきます。</p>
<p class="p1"><img class="alignnone size-full wp-image-156" src="http://tech.eversense.co.jp/wp/wp-content/uploads/2014/10/screenshot.gif" alt="screenshot" width="320" height="268" /></p>

サンプルコードはこちらから
<a href="https://github.com/eversense/Swift-Delegate-Modal-Example" target="_blank">https://github.com/eversense/Swift-Delegate-Modal-Example</a>

今回はメインとなるViewとモーダルとなるViewの2つを用意していきます。
・ParentViewController：メインとなる画面（値の受け取り側）
・ModalViewController：モーダルの画面（値の送り側）
まずはモーダル画面のModalViewControllerから見ていきます。

```swift
import UIKit

protocol ModalViewControllerDelegate{
    func modalDidFinished(modalText: String)
}

class ModalViewController: UIViewController {

    var delegate: ModalViewControllerDelegate! = nil
    let text1 = UITextField()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        self.view.backgroundColor = UIColor.orangeColor()
        
        self.text1.frame = CGRectMake(0, 0, 300, 50)
        self.text1.layer.position = CGPoint(x: self.view.frame.width/2, y:100)
        self.text1.backgroundColor = UIColor.whiteColor()
        self.view.addSubview(self.text1)
        
        let submitBtn = UIButton(frame: CGRectMake(0, 0, 300, 50))
        submitBtn.layer.position = CGPoint(x: self.view.frame.width/2, y:200)
        submitBtn.setTitle("Submit", forState: .Normal)
        submitBtn.addTarget(self, action: "submit:", forControlEvents: .TouchUpInside)
        self.view.addSubview(submitBtn)
        
        
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    func submit(sender: AnyObject) {
        self.delegate.modalDidFinished(self.text1.text)
    }
}
```

delegateを使うため、protocolでModalViewControllerDelegate設定します。delegateで使うメソッドのmodalDidFinishedを示しておきます。このmodalDidFinishedをParentViewControllerでメソッドを書く必要があります。

Submitのボタンを押すと、modalDidFinishedにtext1のフォームに入力されたテキストを送るようにしてあります。

次にメイン画面のParentViewControllerをみてみましょう。

```swift
import UIKit

class ParentViewController: UIViewController, ModalViewControllerDelegate {

    let modalView = ModalViewController()
    let modalTextLabel = UILabel()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        let showModalBtn = UIButton(frame: CGRectMake(0, 0, 300, 50))
        showModalBtn.layer.position = CGPoint(x: self.view.frame.width/2, y: 100)
        showModalBtn.setTitle("Show Modal", forState: .Normal)
        showModalBtn.setTitleColor(UIColor.blueColor(), forState: .Normal)
        showModalBtn.addTarget(self, action: "showModal:", forControlEvents:.TouchUpInside)
        self.view.addSubview(showModalBtn)
        
        self.modalTextLabel.frame = CGRectMake(0, 0, 300, 50)
        self.modalTextLabel.layer.position = CGPoint(x: self.view.frame.width/2, y: 200)
        self.modalTextLabel.textAlignment = .Center
        self.modalTextLabel.text = "The Modal text is ..."
        self.modalTextLabel.textColor = UIColor.blackColor()
        self.view.addSubview(modalTextLabel)
        
        self.modalView.delegate = self

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func showModal(sender: AnyObject){
        self.presentViewController(self.modalView, animated: true, completion: nil)
    }

    func modalDidFinished(modalText: String){
        println(modalText)
        self.modalTextLabel.text = modalText
        self.modalView.dismissViewControllerAnimated(true, completion: nil)
    }
}
```

showModalBtnをタップすることでモーダル画面を表示させるようにしています。モーダルの呼び出しにはpresentViewControllerを使います。

モーダル側のデリゲートとして設定されたmodalDidFinishedを使い、モーダルの終了処理と渡された値を取得して、処理を書きます。今回はモーダル側のテキストフィールドに書かれたテキストを、メイン側のラベルに入れてみました。

以上が、デリゲートを使ったモーダルの値渡しでした。
<p class="p1">サンプルコードはこちらから
<a href="https://github.com/eversense/Swift-Delegate-Modal-Example" target="_blank">https://github.com/eversense/Swift-Delegate-Modal-Example</a></p>