一篇文章學會頁面傳值的10種方法(上)

1、最簡單AB面正向傳值

效果如下:

最簡單的正向傳值.gif

首先我們先創建兩個視圖控制器ViewController.swift和SubViewController.swift

設置第一個界面

首先在第一個界面創建好一個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)? ? }}

在這里我們設置當點擊屏幕跳轉到第二個界面

并且執行傳值操作

在SubViewController里設置一個公開的屬性去接收數據

varstring: String?

在ViewController里設置點擊屏幕時傳值

//當點擊屏幕時執行該方法overridefunctouchesBegan(touches: Set, withEvent event: UIEvent?){//MARK:創建第二個界面的對象letsvc =SubViewController()//MARK:通過屬性來進行正向傳值svc.string =self.textField.text//跳轉到第二個界面self.presentViewController(svc, animated:true, completion:nil)? ? }

在第二個界面里創建好一個label用來接收值

添加一個label控件

//控件不公開privatelettextLabel =UILabel()overridefuncviewDidLoad(){super.viewDidLoad()self.view.backgroundColor =UIColor.cyanColor()? ? ? ? textLabel.frame =CGRectMake(7,200,400,50)? ? ? ? textLabel.textAlignment = .Centerself.view.addSubview(textLabel)

在視圖將要顯示的時候將傳進來的值賦值給控件

overridefuncviewWillAppear(animated: Bool){super.viewWillAppear(animated)//在視圖將要顯示的時候,去將傳進來的值,賦給控件self.textLabel.text = string? ? }

當點擊屏幕時,返回第一個界面

overridefunctouchesBegan(touches: Set, withEvent event: UIEvent?){//返回上一頁面self.dismissViewControllerAnimated(true, completion:nil)? ? }

2、利用屬性進行AB頁面的反向傳值

效果如下:

簡單反向傳值.gif

首先我們先創建兩個視圖控制器ViewController.swift和SubViewController.swift

第一步

在ViewController里面設置好一個固定的Label,設置顯示的文字為:Location Services,和一個顯示狀態的statusLabel

第二步

在SubViewController里定義一個屬性,去接收返回值的目標對象

var vc: ViewController?

然后放置一個UISwitch,設置開關的相應方法

//設置開關的響應方法funcswAction(sw:UISwitch){//判斷狀態ifsw.on {//MARK:此步驟實現反向傳值,將狀態值回傳給A頁面self.vc?.lsStatusLabel.text ="ON"}else{self.vc?.lsStatusLabel.text ="OFF"}? ? }

第三步

在ViewController里面設置touchBegan方法

overridefunctouchesBegan(touches: Set, withEvent event: UIEvent?){//MARK:實例化一個第二個界面的對象letsvc =SubViewController()//給B頁面傳值,告訴B回傳數據的目標是誰svc.vc =self//點擊屏幕時跳轉到第二個界面self.presentViewController(svc, animated:true, completion:nil)? ? }

3、利用NSUserDefult雙向傳值

效果如下:

NSUserDefault.gif

原理:NSUserDefaults是系統對plist文件封裝好的一個類,我們可以通過這個類對文件進行讀寫,在在HomeDirectory/Library/preferences/XXX.userdefaults.plist下。利用NSUserDefaults的特性,將某一個界面要傳出的值存入到plist文件中,然后再另一個界面從plist文件讀出來,就完成了傳值操作

第一步

創建好ViewController和SubViewController

在ViewController中布局好Label的位置

第二步

在SubViewController中創建好5個按鈕,為每個按鈕添加tag值,并且實現交替選中效果,代碼如下:

fori in0..<5{? ? ? ? ? ? let button = UIButton(type: .System)? ? ? ? ? ? button.setTitle("第\(i + 1)個按鈕", forState: .Normal)? ? ? ? ? ? button.frame = CGRectMake(7, CGFloat(150+ i *100),400,100)//為每一個button設置tag值button.tag =100+ i//點擊事件button.addTarget(self, action:#selector(self.buttonAction(_:)), forControlEvents: .TouchUpInside)self.view.addSubview(button)? ? ? ? }

設置點擊事件,實現交替選中效果

foriin0..<5{letbtn =self.view.viewWithTag(100+ i)as!UIButtonbtn.selected =false}? ? ? ? sender.selected =true

在點擊事件中同時使用NSUserDefaults將該按鈕的tag值寫入plist文件,做成數據記錄

首先獲取NSUserDefaults對象,這個對象是一個單例對象

let userDefaults = NSUserDefaults.standardUserDefaults()

將按鈕的tag值做成數據記錄

let selectedIndex = String(sender.tag)

寫入plist文件

userDefaults.setObject(selectedIndex, forKey: "selectedIndex")

回寫文件

userDefaults.synchronize()

第三步

從ViewController的viewWillAppear函數中我們讀取plist文件,并完成反向傳值

首先獲取NSUserDefaults的對象

let userDefaults = NSUserDefaults.standardUserDefaults()

讀取出數據,獲取出SubViewController中對應button的tag值

let si = userDefaults.objectForKey("selectedIndex")

此時的si是AnyObject類型,我們將他轉化成int類型

let tag = si?.intValue

然后修改ViewController中的label的文字

self.label.text = "第\(tag! - 99)個按鈕是選中轉態"

到這兒,就完成了反向傳值的過程,第二個界面的哪個button被選中在第一個界面就會顯示出來,效果如下

NSUserDefaults正向.gif

但是,再次從第一個界面跳回第二個界面是,按鈕就變成全部為未選中狀態,下面就是實現執行正向傳值

同樣是獲取NSUserDefaults對象,然后讀取數據,最后獲取tag值找到對象button,設置該button為選中狀態,在這兒還需讀者自行去完成接下來的內容

4、使用系統閉包反向傳值

這種方式是使用系統自帶的閉包

self.presentViewController(UIViewController, animated: Bool) {? ? ? ? ? ? code? ? ? ? }

這種傳值方式傳值會有延遲,因為是在執行完頁面切換后再去進行傳值

效果如下:

系統閉包傳值.gif

第一步

首先創建好ViewController和SubViewController

viewController中布局好一個label用來顯示接收到數據,在SubViewController中布局好一個TextFeild用來寫數據

第二步

在SubViewController中創建一個接收屬性

var vc: ViewController?

第三步

在ViewController中寫touchBegan方法

獲取第SubViewController對象,在presentViewController方法中打開閉包,在將ViewController傳給SubViewController的vc

overridefunctouchesBegan(touches: Set, withEvent event: UIEvent?){letsvc =SubViewController()//將視圖控制器本身傳過去,方便回傳使用self.presentViewController(svc, animated:true) {//這個方法是在彈出下一頁面后執行svc.vc =self}? ? }

第四步

在SubViewController中寫touchBegan方法

在self.dismissViewControllerAnimated方法中打開閉包將屬性tf中的文字回傳給屬性vc的textLabel

overridefunctouchesBegan(touches: Set, withEvent event: UIEvent?){self.dismissViewControllerAnimated(true) {//利用這個閉包來回傳數據self.vc!.textLabel.text =self.tf.text? ? ? ? }? ? }

5、自定義閉包傳值

和使用系統閉包傳值的思想相同,自定義閉包傳值就是自己聲明一個閉包,通過這個閉包來進行頁面之間的相互傳值

效果同第4種

第一步

創建好ViewController和SubViewController

分別在vc和subvc中布局好一個label和textFeild

在SubViewController中聲明一個閉包

var backValueClusore:((text:String)->Void)?

第二步

在ViewController中寫touchBegan方法

獲取第SubViewController對象,在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:直接執行閉包self.dismissViewControllerAnimated(true, completion:nil)self.backValueclusore!(text:self.tf.text!)

一篇文章學會頁面傳值的10種方法(下)

一篇文章學會頁面傳值的10種方法(下) - 簡書

— 前五種方法點擊這兒:一篇文章學會頁面傳值的10種方法(上) 6、代理委托實現頁面之間的反向傳值 這一種方法就是運用協議實現傳值,這種方式也是在工程中常用的一種傳值方法。首先創建好ViewController和SubViewController,在ViewController中創建好一個展示信息的Label,在SubViewController中創建好一個TextFeild,我們實現在第二個界面點擊屏幕時,將TextFeild中的文字傳到第一個界面,然后讓背景顏色變色。 效果如下: 第一步: 首先我們要弄清

Demoer?www.lxweimin.com →

推薦拓展閱讀

舉報文章

廣告及垃圾信息

抄襲或未授權轉載

其他

著作權歸作者所有

如果覺得我的文章對您有用,請隨意打賞。您的支持將鼓勵我繼續創作!

¥ 打賞支持

文/Demoer(簡書作者)

原文鏈接:http://www.lxweimin.com/p/946721516d3f

著作權歸作者所有,轉載請聯系作者獲得授權,并標注“簡書作者”。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容