1、最簡單AB面正向傳值
效果如下:
首先我們先創(chuàng)建兩個視圖控制器ViewController.swift和SubViewController.swift
設(shè)置第一個界面
首先在第一個界面創(chuàng)建好一個TextFeild钠怯,用來寫我們要傳的文字
import UIKit
class ViewController: UIViewController {
let textField = UITextField()
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.whiteColor()
textField.frame = CGRectMake(7, 100, 400, 50)
textField.borderStyle = .RoundedRect
self.view.addSubview(textField)
}
}
在這里我們設(shè)置當(dāng)點擊屏幕跳轉(zhuǎn)到第二個界面
并且執(zhí)行傳值操作
在SubViewController里設(shè)置一個公開的屬性去接收數(shù)據(jù)
var string: String?
在ViewController里設(shè)置點擊屏幕時傳值
//當(dāng)點擊屏幕時執(zhí)行該方法
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
//MARK:創(chuàng)建第二個界面的對象
let svc = SubViewController()
//MARK:通過屬性來進(jìn)行正向傳值
svc.string = self.textField.text
//跳轉(zhuǎn)到第二個界面
self.presentViewController(svc, animated: true, completion: nil)
}
在第二個界面里創(chuàng)建好一個label用來接收值
添加一個label控件
//控件不公開
private let textLabel = UILabel()
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.cyanColor()
textLabel.frame = CGRectMake(7, 200, 400, 50)
textLabel.textAlignment = .Center
self.view.addSubview(textLabel)
在視圖將要顯示的時候?qū)鬟M(jìn)來的值賦值給控件
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
//在視圖將要顯示的時候早抠,去將傳進(jìn)來的值诗力,賦給控件
self.textLabel.text = string
}
當(dāng)點擊屏幕時,返回第一個界面
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
//返回上一頁面
self.dismissViewControllerAnimated(true, completion: nil)
}
2、利用屬性進(jìn)行AB頁面的反向傳值
效果如下:
首先我們先創(chuàng)建兩個視圖控制器ViewController.swift和SubViewController.swift
第一步
在ViewController里面設(shè)置好一個固定的Label,設(shè)置顯示的文字為:Location Services胜宇,和一個顯示狀態(tài)的statusLabel
第二步
在SubViewController里定義一個屬性,去接收返回值的目標(biāo)對象
var vc: ViewController?
然后放置一個UISwitch恢着,設(shè)置開關(guān)的相應(yīng)方法
//設(shè)置開關(guān)的響應(yīng)方法
func swAction(sw:UISwitch){
//判斷狀態(tài)
if sw.on {
//MARK:此步驟實現(xiàn)反向傳值桐愉,將狀態(tài)值回傳給A頁面
self.vc?.lsStatusLabel.text = "ON"
}else{
self.vc?.lsStatusLabel.text = "OFF"
}
}
第三步
在ViewController里面設(shè)置touchBegan方法
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
//MARK:實例化一個第二個界面的對象
let svc = SubViewController()
//給B頁面?zhèn)髦担嬖VB回傳數(shù)據(jù)的目標(biāo)是誰
svc.vc = self
//點擊屏幕時跳轉(zhuǎn)到第二個界面
self.presentViewController(svc, animated: true, completion: nil)
}
3掰派、利用NSUserDefult雙向傳值
效果如下:
原理:NSUserDefaults是系統(tǒng)對plist文件封裝好的一個類从诲,我們可以通過這個類對文件進(jìn)行讀寫,在在*HomeDirectory/Library/preferences/XXX.userdefaults.plist
*下靡羡。利用NSUserDefaults的特性系洛,將某一個界面要傳出的值存入到plist文件中,然后再另一個界面從plist文件讀出來略步,就完成了傳值操作
第一步
創(chuàng)建好ViewController和SubViewController
在ViewController中布局好Label的位置
第二步
在SubViewController中創(chuàng)建好5個按鈕描扯,為每個按鈕添加tag值,并且實現(xiàn)交替選中效果纳像,代碼如下:
for i in 0..<5 {
let button = UIButton(type: .System)
button.setTitle("第\(i + 1)個按鈕", forState: .Normal)
button.frame = CGRectMake(7, CGFloat(150 + i * 100), 400, 100)
//為每一個button設(shè)置tag值
button.tag = 100 + i
//點擊事件
button.addTarget(self, action: #selector(self.buttonAction(_:)), forControlEvents: .TouchUpInside)
self.view.addSubview(button)
}
設(shè)置點擊事件,實現(xiàn)交替選中效果
for i in 0..<5 {
let btn = self.view.viewWithTag(100 + i) as! UIButton
btn.selected = false
}
sender.selected = true
在點擊事件中同時使用NSUserDefaults將該按鈕的tag值寫入plist文件荆烈,做成數(shù)據(jù)記錄
首先獲取NSUserDefaults對象,這個對象是一個單例對象
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的對象
let userDefaults = NSUserDefaults.standardUserDefaults()
讀取出數(shù)據(jù),獲取出SubViewController中對應(yīng)button的tag值
let si = userDefaults.objectForKey("selectedIndex")
此時的si是AnyObject類型憔购,我們將他轉(zhuǎn)化成int類型
let tag = si?.intValue
然后修改ViewController中的label的文字
self.label.text = "第\(tag! - 99)個按鈕是選中轉(zhuǎn)態(tài)"
到這兒,就完成了反向傳值的過程岔帽,第二個界面的哪個button被選中在第一個界面就會顯示出來玫鸟,效果如下
但是,再次從第一個界面跳回第二個界面是犀勒,按鈕就變成全部為未選中狀態(tài)屎飘,下面就是實現(xiàn)執(zhí)行正向傳值
同樣是獲取NSUserDefaults對象,然后讀取數(shù)據(jù)贾费,最后獲取tag值找到對象button钦购,設(shè)置該button為選中狀態(tài),在這兒還需讀者自行去完成接下來的內(nèi)容
4褂萧、使用系統(tǒng)閉包反向傳值
這種方式是使用系統(tǒng)自帶的閉包
self.presentViewController(UIViewController, animated: Bool) {
code
}
這種傳值方式傳值會有延遲押桃,因為是在執(zhí)行完頁面切換后再去進(jìn)行傳值
效果如下:
第一步
首先創(chuàng)建好ViewController和SubViewController
viewController中布局好一個label用來顯示接收到數(shù)據(jù),在SubViewController中布局好一個TextFeild用來寫數(shù)據(jù)
第二步
在SubViewController中創(chuàng)建一個接收屬性
var vc: ViewController?
第三步
在ViewController中寫touchBegan方法
獲取第SubViewController對象导犹,在presentViewController方法中打開閉包唱凯,在將ViewController傳給SubViewController的vc
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
let svc = SubViewController()
//將視圖控制器本身傳過去羡忘,方便回傳使用
self.presentViewController(svc, animated: true) {
//這個方法是在彈出下一頁面后執(zhí)行
svc.vc = self
}
}
第四步
在SubViewController中寫touchBegan方法
在self.dismissViewControllerAnimated方法中打開閉包將屬性tf中的文字回傳給屬性vc的textLabel
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
self.dismissViewControllerAnimated(true) {
//利用這個閉包來回傳數(shù)據(jù)
self.vc!.textLabel.text = self.tf.text
}
}
5、自定義閉包傳值
和使用系統(tǒng)閉包傳值的思想相同磕昼,自定義閉包傳值就是自己聲明一個閉包卷雕,通過這個閉包來進(jìn)行頁面之間的相互傳值
效果同第4種
第一步
創(chuàng)建好ViewController和SubViewController
分別在vc和subvc中布局好一個label和textFeild
在SubViewController中聲明一個閉包
var backValueClusore:((text:String)->Void)?
第二步
在ViewController中寫touchBegan方法
獲取第SubViewController對象,在presentViewController方法中打開閉包票从,在將ViewController傳給SubViewController的vc
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
let svc = SubViewController()
self.presentViewController(svc, animated: true, completion: nil)
//MARK:將閉包中的text賦值給self.textLabel
svc.backValueclusore = {(text:String)->Void in
self.textLabel.text = text
}
第三步
在SubViewController中寫touchBegan方法
在self.dismissViewControllerAnimated方法中打開閉包將屬性tf中的文字回傳給屬性vc的textLabel
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
//MARK:直接執(zhí)行閉包
self.dismissViewControllerAnimated(true, completion: nil)
self.backValueclusore!(text:self.tf.text!)