1、最簡(jiǎn)單AB面正向傳值
效果如下:

最簡(jiǎn)單的正向傳值.gif
首先我們先創(chuàng)建兩個(gè)視圖控制器ViewController.swift和SubViewController.swift
設(shè)置第一個(gè)界面
首先在第一個(gè)界面創(chuàng)建好一個(gè)TextFeild,用來寫我們要傳的文字
importUIKitclassViewController:UIViewController{lettextField =UITextField()overridefuncviewDidLoad(){super.viewDidLoad()self.view.backgroundColor =UIColor.whiteColor()? ? ? ? textField.frame =CGRectMake(7,100,400,50)? ? ? ? textField.borderStyle = .RoundedRectself.view.addSubview(textField)? ? }}
在這里我們?cè)O(shè)置當(dāng)點(diǎn)擊屏幕跳轉(zhuǎn)到第二個(gè)界面
并且執(zhí)行傳值操作
在SubViewController里設(shè)置一個(gè)公開的屬性去接收數(shù)據(jù)
varstring: String?
在ViewController里設(shè)置點(diǎn)擊屏幕時(shí)傳值
//當(dāng)點(diǎn)擊屏幕時(shí)執(zhí)行該方法overridefunctouchesBegan(touches: Set, withEvent event: UIEvent?){//MARK:創(chuàng)建第二個(gè)界面的對(duì)象letsvc =SubViewController()//MARK:通過屬性來進(jìn)行正向傳值svc.string =self.textField.text//跳轉(zhuǎn)到第二個(gè)界面self.presentViewController(svc, animated:true, completion:nil)? ? }
在第二個(gè)界面里創(chuàng)建好一個(gè)label用來接收值
添加一個(gè)label控件
//控件不公開privatelettextLabel =UILabel()overridefuncviewDidLoad(){super.viewDidLoad()self.view.backgroundColor =UIColor.cyanColor()? ? ? ? textLabel.frame =CGRectMake(7,200,400,50)? ? ? ? textLabel.textAlignment = .Centerself.view.addSubview(textLabel)
在視圖將要顯示的時(shí)候?qū)鬟M(jìn)來的值賦值給控件
overridefuncviewWillAppear(animated: Bool){super.viewWillAppear(animated)//在視圖將要顯示的時(shí)候,去將傳進(jìn)來的值,賦給控件self.textLabel.text = string? ? }
當(dāng)點(diǎn)擊屏幕時(shí),返回第一個(gè)界面
overridefunctouchesBegan(touches: Set, withEvent event: UIEvent?){//返回上一頁(yè)面self.dismissViewControllerAnimated(true, completion:nil)? ? }
2、利用屬性進(jìn)行AB頁(yè)面的反向傳值
效果如下:

簡(jiǎn)單反向傳值.gif
首先我們先創(chuàng)建兩個(gè)視圖控制器ViewController.swift和SubViewController.swift
第一步
在ViewController里面設(shè)置好一個(gè)固定的Label,設(shè)置顯示的文字為:Location Services,和一個(gè)顯示狀態(tài)的statusLabel
第二步
在SubViewController里定義一個(gè)屬性,去接收返回值的目標(biāo)對(duì)象
var vc: ViewController?
然后放置一個(gè)UISwitch,設(shè)置開關(guān)的相應(yīng)方法
//設(shè)置開關(guān)的響應(yīng)方法funcswAction(sw:UISwitch){//判斷狀態(tài)ifsw.on {//MARK:此步驟實(shí)現(xiàn)反向傳值,將狀態(tài)值回傳給A頁(yè)面self.vc?.lsStatusLabel.text ="ON"}else{self.vc?.lsStatusLabel.text ="OFF"}? ? }
第三步
在ViewController里面設(shè)置touchBegan方法
overridefunctouchesBegan(touches: Set, withEvent event: UIEvent?){//MARK:實(shí)例化一個(gè)第二個(gè)界面的對(duì)象letsvc =SubViewController()//給B頁(yè)面?zhèn)髦?,告訴B回傳數(shù)據(jù)的目標(biāo)是誰svc.vc =self//點(diǎn)擊屏幕時(shí)跳轉(zhuǎn)到第二個(gè)界面self.presentViewController(svc, animated:true, completion:nil)? ? }
3、利用NSUserDefult雙向傳值
效果如下:

NSUserDefault.gif
原理:NSUserDefaults是系統(tǒng)對(duì)plist文件封裝好的一個(gè)類,我們可以通過這個(gè)類對(duì)文件進(jìn)行讀寫,在在HomeDirectory/Library/preferences/XXX.userdefaults.plist下。利用NSUserDefaults的特性,將某一個(gè)界面要傳出的值存入到plist文件中,然后再另一個(gè)界面從plist文件讀出來,就完成了傳值操作
第一步
創(chuàng)建好ViewController和SubViewController
在ViewController中布局好Label的位置
第二步
在SubViewController中創(chuàng)建好5個(gè)按鈕,為每個(gè)按鈕添加tag值,并且實(shí)現(xiàn)交替選中效果,代碼如下:
fori in0..<5{? ? ? ? ? ? let button = UIButton(type: .System)? ? ? ? ? ? button.setTitle("第\(i + 1)個(gè)按鈕", forState: .Normal)? ? ? ? ? ? button.frame = CGRectMake(7, CGFloat(150+ i *100),400,100)//為每一個(gè)button設(shè)置tag值button.tag =100+ i//點(diǎn)擊事件button.addTarget(self, action:#selector(self.buttonAction(_:)), forControlEvents: .TouchUpInside)self.view.addSubview(button)? ? ? ? }
設(shè)置點(diǎn)擊事件,實(shí)現(xiàn)交替選中效果
foriin0..<5{letbtn =self.view.viewWithTag(100+ i)as!UIButtonbtn.selected =false}? ? ? ? sender.selected =true
在點(diǎn)擊事件中同時(shí)使用NSUserDefaults將該按鈕的tag值寫入plist文件,做成數(shù)據(jù)記錄
首先獲取NSUserDefaults對(duì)象,這個(gè)對(duì)象是一個(gè)單例對(duì)象
let userDefaults = NSUserDefaults.standardUserDefaults()
將按鈕的tag值做成數(shù)據(jù)記錄
let selectedIndex = String(sender.tag)
寫入plist文件
userDefaults.setObject(selectedIndex, forKey: "selectedIndex")
回寫文件
userDefaults.synchronize()
第三步
從ViewController的viewWillAppear函數(shù)中我們讀取plist文件,并完成反向傳值
首先獲取NSUserDefaults的對(duì)象
let userDefaults = NSUserDefaults.standardUserDefaults()
讀取出數(shù)據(jù),獲取出SubViewController中對(duì)應(yīng)button的tag值
let si = userDefaults.objectForKey("selectedIndex")
此時(shí)的si是AnyObject類型,我們將他轉(zhuǎn)化成int類型
let tag = si?.intValue
然后修改ViewController中的label的文字
self.label.text = "第\(tag! - 99)個(gè)按鈕是選中轉(zhuǎn)態(tài)"
到這兒,就完成了反向傳值的過程,第二個(gè)界面的哪個(gè)button被選中在第一個(gè)界面就會(huì)顯示出來,效果如下

NSUserDefaults正向.gif
但是,再次從第一個(gè)界面跳回第二個(gè)界面是,按鈕就變成全部為未選中狀態(tài),下面就是實(shí)現(xiàn)執(zhí)行正向傳值
同樣是獲取NSUserDefaults對(duì)象,然后讀取數(shù)據(jù),最后獲取tag值找到對(duì)象button,設(shè)置該button為選中狀態(tài),在這兒還需讀者自行去完成接下來的內(nèi)容
4、使用系統(tǒng)閉包反向傳值
這種方式是使用系統(tǒng)自帶的閉包
self.presentViewController(UIViewController, animated: Bool) {? ? ? ? ? ? code? ? ? ? }
這種傳值方式傳值會(huì)有延遲,因?yàn)槭窃趫?zhí)行完頁(yè)面切換后再去進(jìn)行傳值
效果如下:

系統(tǒng)閉包傳值.gif
第一步
首先創(chuàng)建好ViewController和SubViewController
viewController中布局好一個(gè)label用來顯示接收到數(shù)據(jù),在SubViewController中布局好一個(gè)TextFeild用來寫數(shù)據(jù)
第二步
在SubViewController中創(chuàng)建一個(gè)接收屬性
var vc: ViewController?
第三步
在ViewController中寫touchBegan方法
獲取第SubViewController對(duì)象,在presentViewController方法中打開閉包,在將ViewController傳給SubViewController的vc
overridefunctouchesBegan(touches: Set, withEvent event: UIEvent?){letsvc =SubViewController()//將視圖控制器本身傳過去,方便回傳使用self.presentViewController(svc, animated:true) {//這個(gè)方法是在彈出下一頁(yè)面后執(zhí)行svc.vc =self}? ? }
第四步
在SubViewController中寫touchBegan方法
在self.dismissViewControllerAnimated方法中打開閉包將屬性tf中的文字回傳給屬性vc的textLabel
overridefunctouchesBegan(touches: Set, withEvent event: UIEvent?){self.dismissViewControllerAnimated(true) {//利用這個(gè)閉包來回傳數(shù)據(jù)self.vc!.textLabel.text =self.tf.text? ? ? ? }? ? }
5、自定義閉包傳值
和使用系統(tǒng)閉包傳值的思想相同,自定義閉包傳值就是自己聲明一個(gè)閉包,通過這個(gè)閉包來進(jìn)行頁(yè)面之間的相互傳值
效果同第4種
第一步
創(chuàng)建好ViewController和SubViewController
分別在vc和subvc中布局好一個(gè)label和textFeild
在SubViewController中聲明一個(gè)閉包
var backValueClusore:((text:String)->Void)?
第二步
在ViewController中寫touchBegan方法
獲取第SubViewController對(duì)象,在presentViewController方法中打開閉包,在將ViewController傳給SubViewController的vc
override func touchesBegan(touches:Set, withEventevent: UIEvent?) {? ? ? ? let svc = SubViewController()self.presentViewController(svc, animated:true, completion: nil)? ? ? ? //MARK:將閉包中的text賦值給self.textLabel? ? ? ? svc.backValueclusore = {(text:String)->Voidinself.textLabel.text=text}
第三步
在SubViewController中寫touchBegan方法
在self.dismissViewControllerAnimated方法中打開閉包將屬性tf中的文字回傳給屬性vc的textLabel
overridefunctouchesBegan(touches: Set, withEvent event: UIEvent?){//MARK:直接執(zhí)行閉包self.dismissViewControllerAnimated(true, completion:nil)self.backValueclusore!(text:self.tf.text!)
一篇文章學(xué)會(huì)頁(yè)面?zhèn)髦档?0種方法(下)
一篇文章學(xué)會(huì)頁(yè)面?zhèn)髦档?0種方法(下) - 簡(jiǎn)書
— 前五種方法點(diǎn)擊這兒:一篇文章學(xué)會(huì)頁(yè)面?zhèn)髦档?0種方法(上) 6、代理委托實(shí)現(xiàn)頁(yè)面之間的反向傳值 這一種方法就是運(yùn)用協(xié)議實(shí)現(xiàn)傳值,這種方式也是在工程中常用的一種傳值方法。首先創(chuàng)建好ViewController和SubViewController,在ViewController中創(chuàng)建好一個(gè)展示信息的Label,在SubViewController中創(chuàng)建好一個(gè)TextFeild,我們實(shí)現(xiàn)在第二個(gè)界面點(diǎn)擊屏幕時(shí),將TextFeild中的文字傳到第一個(gè)界面,然后讓背景顏色變色。 效果如下: 第一步: 首先我們要弄清
如果覺得我的文章對(duì)您有用,請(qǐng)隨意打賞。您的支持將鼓勵(lì)我繼續(xù)創(chuàng)作!
文/Demoer(簡(jiǎn)書作者)
原文鏈接:http://www.itdecent.cn/p/946721516d3f
著作權(quán)歸作者所有,轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),并標(biāo)注“簡(jiǎn)書作者”。