使用代理进行页面传值

建立一个空项目, 删除 ViewController.swift, 新建 AViewControllor.swiftBViewController.swift, 并在 AViewController 中嵌入导航控制器。分别在这两个控制器中拖入按钮和 Label, 并进行联线和设置 Outlet。 选中 AViewControllorBViewController 之间的联线, 设置其 identifier 为 “AtoB”。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
//
//  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
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
//
//  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 中:

1
2
3
4
5
6
7
8
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
    }

Paste_Image.png

s.gif