建立一个空项目, 删除 ViewController.swift, 新建 AViewControllor.swift 和 BViewController.swift, 并在 AViewController 中嵌入导航控制器。分别在这两个控制器中拖入按钮和 Label, 并进行联线和设置 Outlet。 选中 AViewControllor 和 BViewController 之间的联线, 设置其 identifier 为 "AtoB"。
//
// AViewController.swift
// 控制器间反向传值
//
// Created by chenyf on 16/3/17.
// Copyright © 2016年 chenyf. All rights reserved.
//
import UIKit
class AViewController: UIViewController, UITextFieldDelegate, SendMessageDelegate {
@IBOutlet var aTextField: UITextField!
@IBOutlet var aTextLabel: UILabel!
@IBAction func passValueToB(sender: UIButton) {
}
override func viewDidLoad() {
// 设置控制器为 UITextField 的代理
aTextField.delegate = self
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "AtoB" {
// 取得 B 视图控制器
let bController:BViewController = segue.destinationViewController as! BViewController
// A 给 B 传值
bController.tempString = aTextField.text
bController.delegate = self // 设置代理
}
}
func textFieldShouldReturn(textField: UITextField) -> Bool {
textField.endEditing(true)
return true
}
func sendValue(message: String) {
self.aTextLabel.text = message
}
}
//
// BViewController.swift
// 控制器间反向传值
//
// Created by chenyf on 16/3/17.
// Copyright © 2016年 chenyf. All rights reserved.
//
import UIKit
// 发送消息的协议
protocol SendMessageDelegate {
func sendValue(message: String)
}
class BViewController: UIViewController, UITextFieldDelegate {
// 代理给 A 控制器, 是为了把值传给 A, 这儿用协议来进行控制器之间的通信
var delegate: SendMessageDelegate?
var tempString:String?
@IBOutlet var bTextField: UITextField!
@IBOutlet var bTextLabel: UILabel!
@IBAction func passValueToA(sender: UIButton) {
if(self.delegate != nil) {
self.delegate!.sendValue(bTextField.text!)
self.navigationController?.popViewControllerAnimated(true)
}
}
override func viewDidLoad() {
super.viewDidLoad()
bTextField.delegate = self
self.bTextLabel.text = tempString
}
func textFieldShouldReturn(textField: UITextField) -> Bool {
textField.endEditing(true)
return true
}
}
在 AppDelegate.swift 中:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// 获取根视图控制器
let nav = self.window!.rootViewController as! UINavigationController
// 将 AViewController 实例设置为导航控制器的 topViewController
let _ = nav.topViewController as! AViewController
return true
}