写在前面
今天探讨Swift中的通知,代理,闭包(Block)三种方式进行传值
闭包传值
第一步 首先建立两个控制器
第一个控制器 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
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)
}
@objc func getInfo(info: NSNotification){
let dic:NSDictionary = info.object! as! NSDictionary
print(dic)
}