今天探讨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
}