使用代理进行页面间传值

建立一个空项目, 删除 ViewController.swift, 新建 AViewControllor.swiftBViewController.swift, 并在 AViewController 中嵌入导航控制器。分别在这两个控制器中拖入按钮和 Label, 并进行联线和设置 Outlet。 选中 AViewControllorBViewController 之间的联线, 设置其 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
    }
Paste_Image.png
s.gif
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • iOS 实战开发课程笔记 本贴旨在作为对极客班 《iOS 开发实战》第五期期课程视频重新学习的笔记。目标是建立一个...
    黄穆斌阅读 3,123评论 12 57
  • Storyboard是最先在iOS 5引入的一项振奋人心的特性,大幅缩减构建App用户界面所需的时间。 要介绍St...
    余一波_Bobby阅读 62,032评论 11 76
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,276评论 4 61
  • 数学的“美丽” 不在于简单的几个公式,就把世界囊括其中 而在于公式的由来 是如此的紧凑与严密,合情又合理 把数学公...
    怡馨宅阅读 540评论 5 5