iOS
Swift

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

More than 3 years have passed since last update.

モーダルを呼び出し、呼び出し元のコントローラーに値を渡す時のSwiftでの書き方について説明していきます。

screenshot

サンプルコードはこちらから
https://github.com/eversense/Swift-Delegate-Modal-Example

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

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をみてみましょう。

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を使い、モーダルの終了処理と渡された値を取得して、処理を書きます。今回はモーダル側のテキストフィールドに書かれたテキストを、メイン側のラベルに入れてみました。

以上が、デリゲートを使ったモーダルの値渡しでした。

サンプルコードはこちらから
https://github.com/eversense/Swift-Delegate-Modal-Example