遷移元、遷移先の画面を管理する UIViewController をそれぞれ VIewController クラスのインスタンス vc1、 ViewController2 クラスのインスタンス v2 で表すものとします。
vc2を実行中にvc1に情報を書き戻すには次のようにします。
if delegate == nil { ... }
let vc1: ViewController = delegate as! ViewController
vc1.doFromChild(情報)

project navigator のプロジェクト名の上でマウスを右ドラッグして "New File..." を選択します。 iOS の Source で Cocoa Touch Class を選んで Next をクリックします。 Class: には "ViewController2", Subclass of: には "UIViewController" Language: には "Swift" を選びます(クラス名は自由に選んで構いません)。 ViewController2.swift がプロジェクトに追加されます。







| "Go" Button | Action (Touch Up Inside) | goBack()関数 |
| Label | Outlet | myLabel変数 |



delegateで呼ばれるメソッド doFromChild()を定義します。
ボタンがタップされると、まずViewController2 を生成してその delegate プロパティに自分(self, ViewControllerインスタンス)を設定し、 それから画面遷移します。
| ViewController.swiftに追加するコード(赤字部分) |
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var myLabel: UILabel!
@IBAction func tapButton(sender: AnyObject) {
let storyboard = UIStoryboard(name:"Main",bundle:nil)
let controller:ViewController2 = storyboard.instantiateViewControllerWithIdentifier("ViewController2") as! ViewController2
controller.delegate = self
self.presentViewController(controller, animated: true, completion: nil)
}
func doFromChild(sender: AnyObject) {
myLabel.text = String(sender)
}
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
|
ボタンがタップされると、delegate プロパティに値が設定されている場合は ViewController にキャストして、その中の doFromChildメソッドを呼び出します。引数にはここでは現在時刻を与えています。
| ViewController2.swiftに追加するコード(赤字部分) |
import UIKit
class ViewController2: UIViewController {
var delegate: UIViewController!
@IBAction func tapBack(sender: AnyObject) {
if delegate != nil {
print("fire delegate")
let controller: ViewController = delegate! as! ViewController
controller.doFromChild(NSDate())
}
dismissViewControllerAnimated(true, completion: nil)
}
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
|
dismissViewControllerAnimated(true, completion: nil)
を実行する必要があります。この例では ViewController2.tapBack() 関数の最後で実行していますが、
delegate として実行される ViewController.doFromChild() 関数の最後で行ってもよいかもしれません。
たとえば、UIImagePickerクラスを利用するときなどは delegate 先のクラスで imagePickerContoller:didFinishPickingMediaWithInfo: が呼び出されますが、 その最後で dismissViewControllerAnimated()を呼び出して表示を元の画面に戻すのが普通です。
この処理は、BackボタンをタップしたときにViewController2 のdelegateプロパティの doFromChild() 関数が呼び出されることで実現されています。
-->
-->
-->
-->