Swift 基本知识点之九 —通知,代理,闭包(OC中Block)从前向后传值解析

今天探讨Swift中的通知,代理,闭包三种方式进行传值
1 闭包传值
第一步 首先建立两个控制器
第一个控制器 ViewController.swift 如图

import UIKit
class ViewController: UIViewController {
//创建一个label
    //申明一个全局的label
    var fistLab:UILabel = UILabel()
    //声明一个全局的button
    var fistBut:UIButton = UIButton()
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.navigationController?.navigationBar.translucent = false
        //设置label,button的大小
        initLabAndBut()
       
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }


}
extension ViewController{
    func initLabAndBut(){
        fistLab = UILabel(frame: CGRectMake(50, 50, 300, 40))
        fistLab.backgroundColor = UIColor.redColor()
        view.addSubview(fistLab)
        
        fistBut = UIButton(frame: CGRectMake(100, 100, 200, 50))
        fistBut.backgroundColor = UIColor.purpleColor()
        fistBut.setTitle("点击我啊", forState: UIControlState.Normal)
        fistBut.addTarget(self, action: Selector("click"), forControlEvents: UIControlEvents.TouchUpInside)
        view.addSubview(fistBut)
    }
    
    func click(){
        let secV = SecondViewController()
        secV.initWithMyPassValue { (vlaue) -> Void in
            self.fistLab.text = vlaue
        }
        self.navigationController?.pushViewController(secV, animated: true)
    }
    
    
}

这里写图片描述
secondViewconteroller.swift

//
//  SecondViewController.swift
//  特特
//
//  Created by lanou on 16/1/28.
//  Copyright © 2016年 Liuyugang. All rights reserved.
//

import UIKit

//定义一个闭包函数
typealias SecondValueToFist = (vlaue: String)->Void




class SecondViewController: UIViewController {
    //创建一个label
    //申明一个全局的label
    var fistLab:UITextField = UITextField()
    //声明一个全局的button
    var fistBut:UIButton = UIButton()
    //定义闭包函数
    var myValue:SecondValueToFist?//可以为nil
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.darkGrayColor()
        initLabAndBut()

        
    }
    //在定义个传值函数
    func initWithMyPassValue(value:SecondValueToFist?){
        myValue = value
    }
}




extension SecondViewController{
    func initLabAndBut(){
        fistLab = UITextField(frame: CGRectMake(50, 50, 300, 40))
        fistLab.backgroundColor = UIColor.redColor()
        view.addSubview(fistLab)
        
        fistBut = UIButton(frame: CGRectMake(100, 100, 200, 50))
        fistBut.backgroundColor = UIColor.purpleColor()
        fistBut.setTitle("点击我啊", forState: UIControlState.Normal)
        fistBut.addTarget(self, action: Selector("click"), forControlEvents: UIControlEvents.TouchUpInside)
        view.addSubview(fistBut)
    }
    
    func click(){
    //闭包传值
        if(myValue != nil){
            myValue!(vlaue: fistLab.text!)
        }
                  self.navigationController?.popToRootViewControllerAnimated(true)
    }
    
    
}

第二界面截图
这里写图片描述

闭包传值
这里写图片描述
这里写图片描述

第二种传值方式 代理传值
第一步 在第二个控制器里面制定协议

//定义一个代理

protocol SecondViewControllerDelegate{
    func SecToFistValue(value:String)
}

第二步 在第二个控制器定义一个全局的接受协议的变量

    var delegate:SecondViewControllerDelegate?

第三部 在第二个控制器的button点击时间里面调用协议方法

    func click(){
        if self.delegate != nil{
            delegate?.SecToFistValue(fistLab.text!)
        }    self.navigationController?.popToRootViewControllerAnimated(true)
    }

第四部 在第一个控制器里进行指定代理,并实现代理的方法

func click(){
   let secV = SecondViewController()
   secV.delegate = self
   self.navigationController?.pushViewController(secV, animated: true)
 }
 //实现代理方法
   func SecToFistValue(value: String) {
        self.fistLab.text = value
    }

第三种 利用通知传值
第一步 在第二个控制器的button点击时间 发送消息

 func click(){

        if self.delegate != nil{
            delegate?.SecToFistValue(fistLab.text!)
        }
        let dic:NSDictionary = NSDictionary()
        dic.setValue(fistLab.text, forKey: "K1")
        NSNotificationCenter.defaultCenter().postNotificationName("abc", object: self, userInfo:dic as [NSObject : AnyObject])
       self.navigationController?.popToRootViewControllerAnimated(true)
    }

第二部 在第一个控制器里面进行通知的接受

    func click(){
        let secV = SecondViewController()
        secV.delegate = self
        self.navigationController?.pushViewController(secV, animated: true)
         NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("getInfo:"), name: "abc", object: nil)
        
        
    }
    
    func getInfo(info: NSNotification){
            let dic:NSDictionary = info.userInfo!
           let st = dic.valueForKey("k1")
           self.title = st!as?String
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

图解AI

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值